2

C++の奇妙な不一致に気づきました。

私がこのコードを持っているとしましょう:

const char myChars[] = "12345";
std::cout << myChars;

出力は次のとおりです:12345

ただし、次のように変更すると、次のようになります。

const char myChars[] = {'1','2','3','4','5'};
std::cout << myChars;

次に、出力は次のようになります。12345__SOME_RANDOM_DATA_IN_MEMORY__

coutが最初のバージョンの長さを知っているように見えるが、2番目のバージョンの長さを知らないのはなぜですか?また、coutは長ささえ知っていますか?

ありがとう。

4

5 に答える 5

22

2番目の例にはヌルターミネータはありません。

const char myChars[] = {'1','2','3','4','5', 0};

うまくいくでしょう。

文字列リテラルには、文字列の終わりを示すnullターミネータが必要です。

詳細については、このstackoverflowの回答を参照してください:https ://stackoverflow.com/a/2037245/507793

最初の例として、のような引用符を使用して文字列リテラルを作成する場合、引用符を使用するとnullターミネータが暗黙的に使用される"Hello"ため、これはほぼ同等です。{'H', 'e', 'l', 'l', 'o', 0}

于 2013-01-10T16:33:51.163 に答える
4

コンパイラにsizeof(myChars)を要求し、違いに注意してください。文字列の終わりはヌル文字でマークされ、「」を使用すると暗黙的に示されます。

于 2013-01-10T16:34:12.710 に答える
2

mychars[]「12345」で設定する場合は、暗黙的にその末尾にa'\0'を追加し、これが文字列の末尾であることをプログラムに通知します。{'1','2','3','4','5'};

于 2013-01-10T16:34:17.393 に答える
2

C文字列は、特殊文字で終わるchar配列として実装されます\0

文字列リテラルには暗黙的に含まれています。中括弧配列の初期化では追加されませんが。

手動で追加する必要があります

const char myChars[] = {'1','2','3','4','5', '\0'};

または単に

const char myChars[] = {'1','2','3','4','5', 0};

'\0'==0なので数値的に。

于 2013-01-10T16:34:35.083 に答える
2
const char myChars[] = {'1','2','3','4','5','\0'};

null終了文字列を追加することを忘れないでください

于 2013-01-10T16:34:44.953 に答える