为什么在字符串数组中添加空字符?

6

我知道我们必须使用空字符来终止一个字符串数组,就像这样:

char str[5] = { 'A','N','S','\0' };

但我只是想知道为什么在这样的数组中使用空字符来终止是必要的?

另外,为什么不添加一个空字符来终止这些内容:-

char str1[5]="ANS";

4
因为null占用一个字节,而将字符串的长度与字符串本身一起存储可能需要多个字节。在过去,内存很稀缺,所以更小的解决方案胜出。 - dlev
现在这就是我要找的。 - Anurag-Sharma
这是一个维基百科文章,为你提供历史背景:http://en.wikipedia.org/wiki/Null-terminated_string - xxbbcc
1
我认为你的意思是 char str[5] = {'A','N','S','\0'};char str1[5] = "ANS";(即使有明确的长度)。 - chris
我修改了你的问题,因为你的代码示例是错误的。 - xxbbcc
此外,在 str1[5]="ANS" 中不需要这样做,因为编译器会自动为您完成。字符串常量 "ANS" 分配了 4 个字节,并在最后一个字节中放置了零终止符。 - Lee Daniel Crocker
2个回答

9
NULL结束符是将char数组与C语言中的字符串(一个以NULL结尾的char数组)区分开的关键。大多数用于字符串操作的函数都依靠NULL来确定字符串何时结束(完成它的工作),并且不适用于简单的char数组(例如,它们会继续超出数组的边界,并继续执行直到在内存中找到一个NULL位置 - 这往往会破坏内存)。
在C语言中,0(整数值)被认为是布尔FALSE - 所有其他值都被视为TRUE。if,for和while使用0(FALSE)或非零(TRUE)来确定如何分支或是否循环。char是整数类型,而NULL字符(\ 0)实际上只是具有十进制整数值0的char - 即FALSE。这使得制作如操纵或复制字符串之类的函数变得非常简单,因为它们可以安全地循环,只要它正在处理的字符是非零(即TRUE),并在遇到NULL字符(即FALSE)时停止 - 因为这表明字符串的结尾。这使得循环变得非常简单,因为我们不必进行比较,我们只需要知道它是否为0(FALSE)或不为0(TRUE)。
例子:
char source [] =“Test”; //实际上:T e s t \ 0('\ 0'是NULL字符) char dest [8];
int i = 0; char curr;
do { curr = source [i]; dest [i] = curr; i ++; } while(curr); //只要条件为TRUE,即非零,则循环,除NULL字符外的所有字符。

NULL是一个指针值。NUL是一个ASCII字符。字符数组以NUL结尾。字符指针可能具有NULL值。 - Matthew Lundberg
1
C语言使用“空字符”表示'\0',使用“空指针常量”表示NULL。而NUL是ASCII码中表示代码0的字符。建议修改帖子内容。 - chux - Reinstate Monica
是的和不是的... NUL(ASCII 0d)是Null的缩写,就像CR(ASCII 13d)是回车符的缩写一样。 - Baard Kopperud

1

如果你使用任何标准库,虽然它并非必要,但它们都期望这样做。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接