我知道这两个实例会自动添加空终止符:
char test[100] = "Null terminator will follow me";
和
/*...String already initialised*/
sprintf(test,"Null terminator will follow me");
但是在常规 C 使用中还会发生这种情况吗?
首先,NULL
是一个扩展为空指针常量的宏;使用该术语来指代空字符最多会导致混淆,最坏的情况是不正确的代码。
C 字符串以空字符 结束'\0'
,有时称为“NUL”。这是 C 标准对“字符串”一词的定义的一部分:
字符串是由第一个空字符终止并包括第一个空字符的连续字符序列。
几乎任何字符串文字(由字符分隔"
)都隐含地包含一个空终止符——即使还有一个明确的终止符。例如:
"abc\0def"
引用一个包含以下内容的数组:
{ 'a', 'b', 'c', '\0', 'd', 'e', 'f', '\0' }
一个例外是当字符串文字用作与文字长度完全相同的数组的初始值设定项时:
char nonterminated[5] = "12345";
(C++ 没有这种特殊情况,并且使上述声明非法。)
如果您正确使用它们,其中声明的大多数str*()
函数<string.h>
都会为您提供正确的以 null 结尾的字符串。(该函数是一个明显的例外;我建议避免使用它。)strncpy()
任何文档说它处理“字符串”的函数都将需要或产生一个正确的以空值结尾的字符串(假设函数及其文档都是正确的)。
双引号表示终止空字符。如果你写
char mystr[5] = {'A', 'B', 'C', 'D', 'E'};
不会有终止。但是,请注意,如果你写
char mystr[5] = {'A', 'B', 'C'};
该字符串也将以空值结尾,因为初始值设定项之外的元素将隐式设置为 0。
每当您在 C 中使用“这是一个字符串”表示法时,它表示指向字符数组的指针,其中最后一个字符是 '\0'。
许多库定义的函数提供了自动添加空终止符的功能,给出了这些函数的示例
main()
{
char string[100];
scanf("%s",string); //here,the function scanf automatically terminates the entered string with a null character('\0').
}
或者
main()
{
char string[100];
gets(string); //gets function also terminates automatically the function with a null character('\0').
但是如果迭代地使用getchar()、getche()等函数来读取字符串,它们不会自动将终止的空字符放在字符串的末尾。我们必须明确地说出来。给定的一段代码说明了这种情况
//iterative use of getchar function to read string
main()
{
char string[100],ch;
int loc=0;
printf("enter a line of text");
while((ch=getchar())!='\n'))
string[loc++]=ch;
line[loc]='\0'; //null character is added explicitly
printf("the text entered is %s",string);
}
此外,所有字符串文字都会自动以空字符终止,因此我们不需要明确说明。
例如——“你好”
我们在给定的字符串中看到 5 个字符,但它实际上包含 6 个字符。最后一个字符是'\0'。
1) 每个字符串文字都隐含地获取空终止符。
2) 许多 C 库函数会自动为 null 终止结果。例如, sprintf 函数将打印所有参数,然后附加一个空终止符。c 库中的字符串复制函数通常做同样的事情。