10

私はC++をブラッシュアップしていて、文字列、文字配列、およびヌル文字('\0')に関する奇妙な動作に遭遇しました。次のコード:

#include <iostream>
using namespace std;

int main() {
    cout << "hello\0there"[6] << endl;

    char word [] = "hello\0there";
    cout << word[6] << endl;

    string word2 = "hello\0there";
    cout << word2[6] << endl;

    return 0;
}

出力を生成します:

> t
> t
>

舞台裏で何が起こっているのですか?文字列リテラルと宣言されたchar配列't'がインデックス6(internalの後'\0')に格納されているのに、宣言された文字列が格納されていないのはなぜですか?

4

4 に答える 4

9

\0私が覚えている限りでは、最初の 2 つは本質的に単なる配列であり、文字列が出力される方法は、aに遭遇するまで出力し続けることです。したがって、最初の 2 つの例では、文字列の 6 番目の文字のポイント オフセットから開始しますが、この場合は 6 番目の文字であるt.

クラスで何が起こるかというと、文字列のコピーを独自の内部バッファーに作成し、配列の先頭から最初に見つかっstringた文字列まで文字列をコピーすることによって行います。\0したがって、tは最初の の後に来るため、保存されません\0

于 2012-07-20T15:30:34.533 に答える
6

Because the std::string constructor that takes a const char* treats its argument as a C-style string. It simply copies from it until it hits a null-terminator, then stops copying.

So your last example is actually invoking undefined behaviour; word2[6] goes past the end of the string.

于 2012-07-20T15:32:00.480 に答える
4

char*(またはそれに減衰したもの)から文字列を作成しています。これは、C 文字列の規則が適用されることを意味します。つまり、彼らは'\0'終了しています。そのため、word2のみが含まれています"hello"

于 2012-07-20T15:30:20.497 に答える