我知道这两个实例会自动添加空终止符:
char test[100] = "Null terminator will follow me";
和
/*...String already initialised*/
sprintf(test,"Null terminator will follow me");
但在常规C使用中会发生什么呢?
答案 0 :(得分:7)
首先,NULL
是一个扩展为空指针常量的宏;使用该术语来引用null 字符最多会导致混淆,最坏的情况是错误的代码。
C字符串由空字符'\0'
终止,有时称为“NUL”。这是C标准对“字符串”一词的定义的一部分:
string 是由第一个null终止并包含第一个null的连续字符序列 字符。
几乎任何字符串文字(由"
个字符分隔)隐含地包含一个空终止符 - 即使它还有一个明确的终结符。例如:
"abc\0def"
是指包含以下内容的数组:
{ 'a', 'b', 'c', '\0', 'd', 'e', 'f', '\0' }
一个例外是当字符串文字用作与文字长度完全相同的数组的初始值设定项时:
char nonterminated[5] = "12345";
(C ++没有这种特殊情况,并使上述声明非法。)
str*()
中声明的大多数<string.h>
函数将为您提供正确的以空字符结尾的字符串,如果您正确使用它们。 (strncpy()
函数是notable exception;我建议避免它。)
任何文档说它处理“字符串”的函数都要求或产生一个正确的以null结尾的字符串(假设函数及其文档都是正确的)。
答案 1 :(得分:2)
双引号表示终止空字符。如果你写
char mystr[5] = {'A', 'B', 'C', 'D', 'E'};
没有终止。但是,请注意,如果你写
char mystr[5] = {'A', 'B', 'C'};
该字符串也将以空值终止,因为从初始值设定项中省略的元素将隐式设置为0.
答案 2 :(得分:1)
任何时候在C中使用“This is a string”表示法时,它表示指向字符数组的指针,其中最后一个字符为'\ 0'。
答案 3 :(得分:1)
1)每个字符串文字都隐式获取空终止符。
2)许多C库函数会自动将null终止结果。例如,sprintf函数将打印所有参数,然后附加一个空终止符。 c库中的字符串复制函数通常做同样的事情。
答案 4 :(得分:1)
许多库定义的函数提供了自动添加空终止符的功能,给出了这些函数的示例
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'。