做相同功能strcat和strcmp需要空终止字符串作为参数,或者是任何字符的阵列上可接受的?
所有文档都表明它必须以空值终止,但最着名的在线参考之一(http://cplusplus.com)给出以下示例strcmp:
/* strcmp example */
#include <stdio.h>
#include <string.h>
int main ()
{
char szKey[] = "apple";
char szInput[80];
do {
printf ("Guess my favourite fruit? ");
gets (szInput);
} while (strcmp (szKey,szInput) != 0);
puts ("Correct answer!");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
是的,这些函数需要以null结尾的字符串.但是,您上面列出的示例确实使用以null结尾的字符串.例如,该行
char szKey[] = "apple";
Run Code Online (Sandbox Code Playgroud)
描述一个附加了空终止符的字符串,即使它在源代码中没有立即显现.C中的任何字符串文字都会自动以空值终止,即使您没有明确地将请求放在自己中(尽管有一个例外,我们将在一分钟内看到).
而且,在线
gets (szInput);
Run Code Online (Sandbox Code Playgroud)
该函数gets自动将空终止符附加到它从控制台读取的字符串的末尾.事实上,除了极少数例外(例如众所周知的复杂strncat函数),所有字符串操作函数都会<string.h>自动附加一个null终止符.除非您自己明确地弄乱字符字节,否则在常见用法中很少使用非空终止字符串.
也就是说,有很多方法可以获得非空终止的字符串.例如,如果您定义这样的字符串:
char hello[5] = {'h', 'e', 'l', 'l', 'o'}; /* Careful! */
Run Code Online (Sandbox Code Playgroud)
此数组不会以空值终止,因为您已明确列出了您希望它拥有的值.这意味着你拥有的是一个字符数组而不是字符串.如果你然后试着打电话
printf("%s\n", hello);
Run Code Online (Sandbox Code Playgroud)
您将遇到未定义的行为,因为该数组不是以null结尾的.
此外,如果您使用任何原始内存操作例程,memcpy或者memmove,那么您需要小心确保复制或显式设置null终止符,因为这些例程没有null终止符的概念.
此外,一个快速的术语 - NULL通常是指空指针,即明确标记为指向无对象的指针.null-terminator中的null引用具有数值0的字符,并且是用于指示已到达字符串结尾的字符(不是指针).虽然名称相同(并且有相似之处),但最好不要混淆两者.
希望这可以帮助!