像 strcat
和 strcmp
这样的函数是否需要以 null 结尾的字符串作为参数,或者是否可以接受任何字符数组?
所有文档都表明它必须以 null 结尾,但最著名的在线引用之一 (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;
}
最佳答案
是的,这些函数需要以 null 结尾的字符串。但是,上面列出的示例确实使用了以 null 结尾的字符串。例如,行
char szKey[] = "apple";
描述一个附加了空终止符的字符串,尽管它在源代码中并不明显。 C 中的任何字符串文字都会自动以 null 终止,即使您没有明确将请求放入您自己(尽管有一个异常(exception),我们稍后会看到)。
此外,在行中
gets (szInput);
函数gets
自动将空终止符附加到它从控制台读取的字符串的末尾。事实上,除了少数异常(exception)(例如臭名昭著的复杂 strncat
函数),<string.h>
中的所有字符串操作函数。自动附加一个空终止符。在常见用法中很少以非 null 终止的字符串结尾,除非您自己明确地摆弄字符字节。
也就是说,有很多方法可以获取非空终止的字符串。例如,如果您定义这样的字符串:
char hello[5] = {'h', 'e', 'l', 'l', 'o'}; /* Careful! */
这个数组不会以 null 结尾,因为您已经明确列出了您希望它具有的值。这意味着您拥有的是字符数组而不是字符串。如果您随后尝试调用
printf("%s\n", hello);
你会遇到未定义的行为,因为数组不是空终止的。
此外,如果您使用任何原始内存操作例程,如 memcpy
或 memmove
, 那么您需要小心确保空终止符被显式复制或设置,因为这些例程没有空终止符的概念。
另外,一点术语 - NULL
通常指的是空指针,即明确标记为不指向任何对象的指针。 null-terminator中的null指的是数值为0的字符,是一个字符(不是指针),用来表示到达字符串的末尾。虽然名称相同(并且有相似之处),但最好不要混淆两者。
希望这对您有所帮助!
关于c - 什么类型的字符串是 C 字符串函数的合法输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8089199/