[c++] 整数を文字列C ++に変換するitoa()の代わりに?


Answers

boost::lexical_castはうまくいきます。

#include <boost/lexical_cast.hpp>
int main(int argc, char** argv) {
    std::string foo = boost::lexical_cast<std::string>(argc);
}
Question

この質問には既に回答があります:

整数を文字列に変換するためのitoa()代替があるのだろうかと私は疑問に思っていました。なぜならVisual Studioで実行すると警告が表示され、Linuxでプログラムをビルドしようとするとコンパイルエラーが発生するからです。




stringstreamメソッドすべて、ロケールオブジェクトを使用して書式を設定することでロックされる可能性があることに注意してください。 これ 、複数のスレッドからこの変換を使用している場合、注意する必要があります...

詳しくはこちらをご覧ください。




高品質のC ++ライブラリであるBoost.FormatまたはFastFormat試してください:

int i = 10;
std::string result;

Boost.Formatで

result = str(boost::format("%1%", i));

またはFastFormat

fastformat::fmt(result, "{0}", i);
fastformat::write(result, i);

明らかに、それらは両方とも、単一の整数の単純な変換よりもはるかに多くを行います




私は以前このスレッドセーフな関数を書いていましたが、結果に非常に満足していて、MSVC標準のMSVC _itoa()関数の約3倍のパフォーマンスでアルゴリズムが軽くて軽いと感じます。

ここにリンクがあります。 最適な塩基-10 itoa()関数のみ? sprintf()のパフォーマンスは少なくとも10倍です。 ベンチマークは、次のように関数のQAテストでもあります。

start = clock();
for (int i = LONG_MIN; i < LONG_MAX; i++) {
    if (i != atoi(_i32toa(buff, (int32_t)i))) {
        printf("\nError for %i", i);
    }
    if (!i) printf("\nAt zero");
}
printf("\nElapsed time was %f milliseconds", (double)clock() - (double)(start));

呼び出し元のアドレス空間のバッファのどこかに結果が残るように、呼び出し元の記憶域を使用することについていくつかの愚かな提案があります。 それらを無視してください。 ベンチマーク/ QAコードが示すように、私がリストしたコードは完全に機能します。

私は、このコードは組み込み環境で使用するのに十分なだけのものだと考えています。 もちろん、YMMV。




ここにはいくつかの条件付きのitoaのCバージョンがあります:

char* custom_itoa(int i)
{
    static char output[24];  // 64-bit MAX_INT is 20 digits
    char* p = &output[23];

    for(*p--=0;i;i/=10) *p--=i%10+0x30; 
    return ++p;    
}
  • これは負の数を処理しません
  • これは、現在、10進形式の23文字を超える数値を処理しません。
  • スレッドセーフではありません
  • 戻り値は、関数が再度呼び出されるとすぐに消去/破損されます。
    したがって、戻り値を保持する場合は、別のバッファにstrcpyする必要があります。



私たち自身のiota関数をC ++で以下のように定義することができます:

string itoa(int a)
{
    string ss="";   //create empty string
    while(a)
    {
        int x=a%10;
        a/=10;
        char i='0';
        i=i+x;
        ss=i+ss;      //append new character at the front of the string!
    }
    return ss;
}

#include <string>忘れないでください。




sprintf()を試してください:

char str[12];
int num = 3;
sprintf(str, "%d", num); // str now contains "3"

sprintf()はprintf()と似ていますが、文字列に出力します。

また、Parappaがコメントで述べたように、snprintf()を使用してバッファオーバーフローが発生するのを防ぐことができます(変換する数値が文字列のサイズに合わない場合)。

snprintf(str, sizeof(str), "%d", num);



Windows CEの派生プラットフォームでは、デフォルトでiostreamはありません。 そこに行く方法は、 _itoa<>ファミリの場合、普通は_itow<> (大抵の文字列はUnicodeです)。




十分な長さの文字列を割り当て、snprintfを使います。






Related