2

int を cstring に変換しようとしています。stringstream を介して int を通常の文字列に読み取り、その文字列を char 配列に読み取ることにしました。以下は機能しているようですが、コンパイラで運が良かっただけなのだろうかと思っています。コードは健全に見えますか?ありがとう!

int zip = 1234;    

char zipString[30];

stringstream str;

str << zip;

str >> zipString;

cout << zipString;
4

3 に答える 3

4

std::stringストリームの関数からC++ を取得str()し、文字列のc_str()関数から不変の C スタイルのゼロで終わる文字列を取得できます。

std::string cpp_string = str.str();
char const * c_string = cpp_string.c_str();

これらを 1 つの式にまとめたいと思うかもしれませんがstr.str().c_str()、それは間違っています。ポインターで何かを行う前に、C++ 文字列が破棄されます。

バッファが十分に大きいと確信している限り、あなたがしていることはうまくいきます。ただし、C++ 文字列を使用すると、バッファがオーバーフローする危険がなくなります。一般に、C スタイルの文字列を必要とする API を使用する必要がない限り (または、極端な状況では、メモリ割り当てを回避するための最適化として)、C スタイルの文字列を使用しないことをお勧めします。std::string通常は、より安全で作業が簡単です。

于 2012-06-29T14:55:54.360 に答える
2

標準の文字列の代わりに char の配列が必要な特別な理由がない限り、私は後者を使用します。この場合は厳密には必要ありませんがlexical_cast、文字列ストリームを介して明示的に変換を行う代わりに、Boost を使用することもよくあります。

std::string zipString = lexical_cast<std::string>(zip);

次に、結果を c スタイルの文字列として本当に必要とする場合は、 を使用zipString.c_str()してそれを取得できます (ただし、1 つの点でまだ異なります。返されるものを変更することはできません)。

この特定のケースでは、多くのメリットはありませんが、この一般的な順序で変換を一貫して使用すると、合計されます。それを行う場合は、ここでも使用することをお勧めします.

于 2012-06-29T14:59:17.643 に答える
1

のメンバー関数は(別名 C スタイルの文字列) をstd::string返します。c_str()const char*

std::string str = "world";
printf("hello, %s", str.c_str());
于 2012-06-29T14:56:07.433 に答える