2

我一直对 C++/C 中的空终止字符串有疑问。例如,如果你有一个这样的字符数组:

char a[10];

然后你想读这样的字符:

for(int i = 0; i < 10; i++)
{
  cin >> a[i]; 
}

并让我们输入以下单词:提问者

作为输入。

现在我的问题是'\0'会发生什么?如果我要反转字符串,并使其打印出来

renoitseuq

空终止字符在哪里?我认为好的编程习惯是总是为零终止字符留一个额外的字符。但是在这个例子中,一切都被正确打印了,那么为什么要关心空终止字符呢?只是好奇。谢谢你的想法!

4

3 回答 3

3

在某些情况下,您会得到一个空终止符,而在某些情况下您必须自己要求一个。

const char* x = "bla";

是以 null 结尾的 C 样式字符串。它实际上有 4 个字符 - 3 + 空终止符。

您的字符串不是以空值结尾的。事实上,将其视为以 null 结尾的字符串会导致未定义的行为。如果您这样cout <<做,您将尝试读取超出您允许访问的内存,因为运行时将继续寻找一个空终止符并吐出字符,直到它到达一个。在你的情况下,你很幸运最后有一个正确的,但这不是保证。

char a[10];就像任何其他数组一样 - 未初始化的值,10 个字符 - 而不是 11 仅仅因为它是一个char数组。您不会期望int b[10]包含 10 个值供您使用,并在最后包含一个额外的值,0对吗?

好吧,读回来,我不明白为什么你会期望 C 字符串也是如此——这并不全是直观的。

于 2013-02-09T20:07:18.817 回答
0

char a[10]是十个字符,其中任何一个都可以是'\0'. 如果你把"questioner"它们都没有。要获得它,您需要a[11]并用“提问者”填充它,然后'\0'.

如果你要反转它,你会得到第一个'\0'在 a[?] 中的位置,反转到那个位置,然后添加一个空终止符。

这是 C 语言中的经典香蕉皮肤,不幸的是,即使您对它非常熟悉,它仍然会在最不合时宜的时刻踩到您的脚下。

于 2013-02-09T20:27:00.243 回答
0

您正在阅读 10 个字符,而不是字符串。我假设您还反向输出 10 个字符,因此 0-char 不起作用,因为您不将数组用作字符串,而是将其用作单个字符的数组...

于 2013-02-09T20:08:07.247 回答