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





9 Answers

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

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

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

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




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);



私たち自身の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>忘れないでください。




ここにはいくつかの条件付きの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する必要があります。



高品質の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);

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




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




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

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




文字列変換方法に高速で安全な整数を関心があり、標準ライブラリに限定されていない場合は、 C ++ FormatライブラリからFormatIntメソッドを推薦することができます:

fmt::FormatInt(42).str();   // convert to std::string
fmt::FormatInt(42).c_str(); // convert and get as a C string
                            // (mind the lifetime, same as std::string::c_str())

Boost Karmaの整数から文字列への変換のベンチマークによれば、この方法はglibcのsprintfstd::stringstreamより数倍高速です。 独立したベンチマークによって確認されたように、Boost Karma自身のint_generatorよりも高速です。

免責事項:私はこのライブラリの作者です。




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




Related