我一直有一个关于C ++ / C中以空字符结尾的字符串的问题。例如,如果你有一个像这样的字符数组:
char a[10];
然后你想读出这样的字符:
for(int i = 0; i < 10; i++)
{
cin >> a[i];
}
并输入以下字词:提问者
作为输入。
现在我的问题是'\ 0'会发生什么?如果我要反转字符串,并将其打印出来
renoitseuq
空终止字符在哪里?我认为良好的编程习惯是为零终止字符留下一个额外的字符。但是在这个例子中,所有内容都被正确打印,那么为什么要关注空终止字符呢?只是好奇。谢谢你的想法!
答案 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中的经典香蕉皮,不幸的是,即使你对它太熟悉,它仍然能够在最不合时宜的时刻陷入困境。