c - 什么类型的字符串是 C 字符串函数的合法输入?

标签 c string

strcatstrcmp 这样的函数是否需要以 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);

你会遇到未定义的行为,因为数组不是空终止的。

此外,如果您使用任何原始内存操作例程,如 memcpymemmove , 那么您需要小心确保空终止符被显式复制或设置,因为这些例程没有空终止符的概念。

另外,一点术语 - NULL通常指的是空指针,即明确标记为不指向任何对象的指针。 null-terminator中的null指的是数值为0的字符,是一个字符(不是指针),用来表示到达字符串的末尾。虽然名称相同(并且有相似之处),但最好不要混淆两者。

希望这对您有所帮助!

关于c - 什么类型的字符串是 C 字符串函数的合法输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8089199/

相关文章:

c - 检测到堆损坏 : after Normal block

C 条件语句

c - 使用函数在 C 中对数组进行排序,但程序不运行

c# - Automapper:将 int 转换为字符串

C - 将 char 或 int 转换为二进制字符串并附加到 char 数组

c - 在没有运行合成器的情况下使用 x11 协议(protocol)获取覆盖窗口需要什么?

c - c 的另一个阶乘选项

string - 将 SMS 分成 30 个字符大小的 SMS

c# - 在字符串 C# 中查找数组元素

c++ - "#define XXX"的值是多少?