25

次のコードで、2 つの異なる場所にある '\0' の意味がわかりません。

string x = "hhhdef\n";
cout << x << endl;
x[3]='\0';
cout << x << endl;
cout<<"hhh\0defef\n"<<endl;

結果:

hhhdef

ふふふ

うーん

誰かが私にいくつかの指針を与えることができますか?

4

6 に答える 6

26

C++std::stringは「カウントされた」文字列です。つまり、その長さは整数として格納され、任意の文字を含めることができます。3 番目の文字を特別なものに置き換えると、\0他の文字であるかのように出力されます (特に、コンソールは単純に無視します)。

代わりに、最後の行では、最初に見つかった文字列によって末尾が決定される C 文字列を出力し\0ています。このような場合、coutが見つかるまで文字を出力し続け\0ます。これは、あなたの場合、3 番目の の後hです。

于 2013-01-06T15:16:55.500 に答える
11

C++ には 2 つの文字列型があります。

実際には単なるバイト配列である組み込みの C スタイルの null で終了する文字列と、 null で終了しないstd::stringC++ 標準ライブラリクラス。

null で終わる文字列を出力すると、最初の null 文字まですべてが出力されます。astd::stringを印刷すると、途中のヌル文字に関係なく、文字列全体が印刷されます。

于 2013-01-06T15:16:34.153 に答える
10

\0は NULL 文字です。 で見つけることができますASCII table。値は 0 です。

C スタイルの文字列の終わりを決定するために使用されます。

ただし、C++ クラスstd::stringはそのサイズを整数として格納するため、それに依存しません。

于 2013-01-06T15:15:48.040 に答える
4

ここでは文字列を 2 つの異なる方法で表現しているため、動作が異なります。

2 番目の方が説明が簡単です。これは C スタイルの生の char 配列です。C スタイルの文字列で'\0'は、ヌル ターミネータを示します。文字列の終わりを示すために使用されます。したがって、文字列を処理/表示する関数は、ヒットするとすぐに停止します (これが、最後の文字列が切り捨てられる理由です)。

最初の例は、完全な形式の C++std::stringオブジェクトの作成です。これらは特別な意味を割り当てません'\0'(null ターミネータはありません)。

于 2013-01-06T15:16:43.527 に答える