c++ 是否自动插入空字符?

jrcvhitl  于 2022-11-19  发布在  其他
关注(0)|答案(8)|浏览(198)

C编译器会自动在字符数组的末尾插入空字符吗?下面的代码会打印“Word”。那么C编译器会自动在数组的最后一个位置插入空字符吗?

int main()
{
    char x[] = {'W', 'o', 'r', 'd'};
    cout << x << endl;
    return 0;
}
xiozqbni

xiozqbni1#

不,它没有。您的数组x只有4个元素。您传递std::cout一个指向char的指针,它不是一个以空值结尾的字符串的开头。这是未定义的行为。
例如,在我的平台上,类似的代码打印为Word?,带有一个虚假的问号。

3bygqnnd

3bygqnnd2#

在C/C+.中,字符串文字会自动附加以零结尾。

char x[] = "Word";

则数组的大小将等于5,并且数组的最后一个元素将包含“\0”。
当使用下面的记录时,如您所示

char x[] = {'W', 'o', 'r', 'd'};

则编译器分配的元素数与初始化器的个数完全相同。2也就是说,在这种情况下,数组只有4个元素。
但是,如果您按照以下方式编写

char x[5] = {'W', 'o', 'r', 'd'};

则第五个元素将包含终止零,因为它没有对应的初始化器,并且将被零初始化。
还要考虑以下记录在C中有效,但在C++中无效

char x[4] = "Word";
piah890a

piah890a3#

这是未定义的行为,它打印“Word”,因为它也可能崩溃。

lmyy7pcs

lmyy7pcs4#

不,如果你想把它作为一个字符串使用,或者你想用字符串库函数,你必须自己去做。

flvtvl50

flvtvl505#

不,在这种情况下,你只是创建了一个非空终止的数组。如果是基于空终止的读操作,你的程序不会停止,因为它最终不会找到空值。

char x[] = "Word";

在这种情况下,将在末尾为x.Null分配5个字节。

iswrvxsc

iswrvxsc6#

不需要。如果您要自动插入,请使用字串常数:

const char *x = "Word";
//OR 
std::string const s = "Word";
const char *x = s.c_str();
//OR
char x[] = { "Word" }; //using the C++11 brace initializer syntax.

验证这一点最简单的方法是使用调试器查看x的内存地址,并监视它和它后面的几个字节。在初始化之后停止调试器并检查内存内容。

sq1bmfud

sq1bmfud7#

不,如果要将char数组用作字符串,请使用以下形式的初始化程序

char x[] = { "Word" };
5q4ezhmt

5q4ezhmt8#

虽然不能保证,但我的实现似乎总是添加一个\0,即使我没有被请求。
我测试过noNull[2]总是\0

char noNull[] = {'H', 'i'};
for (int i = 2; i < 5; ++i) {
    if (noNull[i] == '\0') {
        std::cout << "index " << i << " is null" << std::endl;
    } else {
        std::cout << "index " << i << " is not null" << std::endl;
    }
}

输出功率

index 2 is null
index 3 is not null
index 4 is not null

相关问题