关于零终止字符的困惑

时间:2013-02-09 20:01:01

标签: c++

我一直有一个关于C ++ / C中以空字符结尾的字符串的问题。例如,如果你有一个像这样的字符数组:

char a[10];

然后你想读出这样的字符:

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

并输入以下字词:提问者

作为输入。

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

renoitseuq

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

3 个答案:

答案 0 :(得分:3)

在某些情况下,你一个空终结者,以及你必须自己要求的情况。

const char* x = "bla";

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

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

char a[10];就像任何其他数组一样 - 未初始化的值,10个字符 - 而不仅仅是11因为它是char数组。你不希望int b[10]包含10个值供你玩,最后只需要0,因为,你会吗?

好吧,回过头来看,我也不明白为什么你也期望从C字符串开始 - 这并不是很直观。

答案 1 :(得分:0)

你正在阅读10个字符,而不是字符串。我假设你也反过来输出10个字符,所以0-char没有任何作用,因为你不使用数组作为字符串,而是作为单个字符数组......

答案 2 :(得分:0)

char a[10]是10个字符,其中任何一个都可以是'\0'。 如果你把"questioner"放在那里,那些都不是。 为此,您需要a[11]并填写“提问者”,然后'\0'

如果你正在反转它,你将获得[?]中第一个'\0'的位置,反过来然后添加一个空终止符。

这是C中的经典香蕉皮,不幸的是,即使你对它太熟悉,它仍然能够在最不合时宜的时刻陷入困境。