我知道这两个实例会自动添加null终止符:
char test[100] = "Null terminator will follow me";
Run Code Online (Sandbox Code Playgroud)
和
/*...String already initialised*/
sprintf(test,"Null terminator will follow me");
Run Code Online (Sandbox Code Playgroud)
但是在常规C使用中会发生什么呢?
首先,NULL
是一个扩展为空指针常量的宏; 使用该术语来引用空字符最多会导致混淆,最坏的情况是错误的代码.
C字符串由空字符终止'\0'
,有时称为"NUL".这是C标准对"字符串"一词的定义的一部分:
甲串是由封端的字符的连续序列,并且包括第一个空字符.
几乎所有的字符串文字(由"
字符分隔)都隐含地包含一个空终止符 - 即使它还有一个明确的终结符.例如:
"abc\0def"
Run Code Online (Sandbox Code Playgroud)
是指包含以下内容的数组:
{ 'a', 'b', 'c', '\0', 'd', 'e', 'f', '\0' }
Run Code Online (Sandbox Code Playgroud)
一个例外是当字符串文字用作与文字长度完全相同的数组的初始值设定项时:
char nonterminated[5] = "12345";
Run Code Online (Sandbox Code Playgroud)
(C++没有这种特殊情况,并使上述声明非法.)
如果正确使用它们,str*()
声明的大多数函数<string.h>
都会为您提供正确的以null结尾的字符串.(该功能是一个值得注意的例外 ;我建议避免它.)strncpy()
任何文档说它处理"字符串"的函数都要求或产生一个正确的以null结尾的字符串(假设函数及其文档都是正确的).