111

私が知っている唯一の方法は次のとおりです。

#include <sstream>
#include <string.h>
using namespace std;

int main() {
  int number=33;
  stringstream strs;
  strs << number;
  string temp_str = strs.str();
  char* char_type = (char*) temp_str.c_str();
}

しかし、タイピングの少ない方法はありますか?

4

10 に答える 10

154
  • C++17 では、次のように使用std::to_charsします。

    std::array<char, 10> str;
    std::to_chars(str.data(), str.data() + str.size(), 42);
    
  • C++11 では、次のように使用std::to_stringします。

    std::string s = std::to_string(number);
    char const *pchar = s.c_str();  //use char const* as target type
    
  • そして C++03 では、次のように使用することを除いて、あなたがしていることは問題ありませんconst

    char const* pchar = temp_str.c_str(); //dont use cast
    
于 2012-06-01T08:58:50.850 に答える
14

sprintf を使用できると思います:

int number = 33;
char* numberstring[(((sizeof number) * CHAR_BIT) + 2)/3 + 2];
sprintf(numberstring, "%d", number);
于 2012-06-01T08:59:16.627 に答える
7

ブーストが使える

#include <boost/lexical_cast.hpp>
string s = boost::lexical_cast<string>( number );
于 2012-06-01T08:56:16.597 に答える
5

Cスタイルの解決策は、を使用することですが、より良い方法は、 /itoaを使用してこの数値を文字列に出力することです。この質問を確認してください:整数を文字列に移植可能に変換する方法は?sprintfsnprintf

itoa関数はANSI-Cで定義されておらず、C ++の一部ではありませんが、一部のコンパイラでサポートされていることに注意してください。これは非標準の関数なので、使用しないでください。この質問もチェックしてください:整数を文字列C ++に変換するためのitoa()の代替?

また、C ++でプログラミングしながらCスタイルのコードを書くことは悪い習慣と見なされ、「恐ろしいスタイル」と呼ばれることもあることに注意してください。本当にCスタイルの文字列に変換しchar*ますか?:)

于 2012-06-01T08:57:43.403 に答える
5

const には理由があるので、最後の行で const を型キャストしません。const char* を使用できない場合は、次のように char 配列をコピーすることをお勧めします。

char* char_type = new char[temp_str.length()];
strcpy(char_type, temp_str.c_str());
于 2012-06-01T08:59:05.033 に答える
3

わかりました..最初に、この質問が求めていることを行うものが必要でしたが、すぐに必要でした! 残念ながら、「より良い」方法は600 行近くのコードです!!! それが何をしているかとは何の関係もない名前を許してください。正式名称はInteger64ToCharArray(int64_t value); でした。

https://github.com/JeremyDX/All-Language-Testing-Code/blob/master/C%2B%2B%20Examples/IntegerToCharArrayTesting.cpp

パフォーマンスを妨げることなく、そのコードをクリーンアップしてみてください。

入力:最小範囲から最大範囲までの任意の符号付き 64 ビット値。

例:

std::cout << "Test: " << AddDynamicallyToBuffer(LLONG_MAX) << '\n';
std::cout << "Test: " << AddDynamicallyToBuffer(LLONG_MIN) << '\n';

出力:

Test: 9223372036854775807
Test: -9223372036854775808

元の速度テスト: ( Integer64ToCharArray(); )

ベストケースの 1 桁の値。

ループ: 100,000,000、所要時間: 1,381(ミリ)、ループあたりの時間 13(ナノ)

最悪の場合の 20 桁の値。

ループ数: 100,000,000、所要時間: 22,656(ミリ)、ループあたりの時間 226(ナノ)

新しい設計速度テスト: ( AddDynamicallyToBuffer(); )

ベストケースの 1 桁の値。

ループ: 100,000,000、所要時間: 427(ミリ)、ループごとの時間 4(ナノ)

32 ビット最悪ケース - 11 桁の値。

ループ: 100,000,000、所要時間: 1,991(ミリ)、ループあたりの時間 19(ナノ)

負の 1 兆最悪のケース - 14 桁の値。

ループ: 100,000,000、所要時間: 5,681(ミリ)、ループあたりの時間 56(ナノ)

64 ビット最悪 - 20 桁の値。

ループ: 100,000,000、所要時間: 13,148(ミリ)、ループあたりの時間 131(ナノ)

使い方!

分割統治法を実行し、文字列の最大長になったら、各文字値を個別に設定します。上記の速度テストに示されているように、長さが大きくなるとパフォーマンスが大幅に低下しますが、元のループ メソッドよりもはるかに高速であり、2 つのメソッド間でコードが実際に変更されていないため、ループは使用されなくなりました。

私の使用法では、代わりにオフセットを返す名前であり、char 配列のバッファーを編集せず、頂点データの更新を開始し、関数にはオフセット用の追加パラメーターがあるため、-1 に初期化されません。

于 2019-01-05T04:25:07.960 に答える
2

この回答を参照してください https://stackoverflow.com/a/23010605/2760919

あなたの場合、snprintf の型を long ("%ld") から int ("%n") に変更するだけです。

于 2014-04-11T11:01:00.997 に答える
0

整数値を std::string に変換して、長さ (桁数) を知ることができます。

次に、文字列の文字サイズ +1 の char 配列の長さを作成するため、値を文字列にコピーしてから char 配列にコピーできます。

#include <string>

char* intToStr(int data) {
    std::string strData = std::to_string(data);

    char* temp = new char[strData.length() + 1];
    strcpy(temp, strData.c_str());

   return temp;
}
于 2020-10-17T16:52:12.867 に答える