输出字符串与预期不符。

3
#include <stdio.h>
#include <stdlib.h>

int main (int argc, char *argv[]) {
   char hello[5];
   hello [0] = 'H';
   hello [1] = 'e';
   hello [2] = 'l';
   hello [3] = 'l';
   hello [4] = 'o';

   char world[5];
   world [0] = 'W';
   world [1] = 'o';
   world [2] = 'r';
   world [3] = 'l';
   world [4] = 'd';

   printf ("%s %s!\n", hello, world);
   return EXIT_SUCCESS;
}

当我运行上述代码时,我会得到:
Hello WorldHello!

有人能解释一下为什么我的输出要么是重复的单词,要么打印出奇怪的数字和字母吗? 这是因为我没有包含 '\0' 吗?


是的,这是因为您没有对字符数组进行空终止,所以您没有任何字符串(因为字符串是空终止的),并且通过向 printf() 传递两个非字符串并告诉它给出了两个字符串来调用未定义的行为。任何事情都可能发生。你很幸运发生的事情基本上是良性的。如果您颠倒定义“hello”和“world”的顺序,您可能会关心自己看到的内容。 - Jonathan Leffler
1个回答

6

C中的字符串需要以NUL('\0')结尾。你所拥有的是没有NUL终止符的char数组,因此不是字符串。

请尝试以下操作。双引号会生成字符串(NUL终止符会自动添加)。

const char *hello = "Hello";
const char *world = "World";

如果您选择最初的方法,逐个字符地设置,那么您需要明确设置NUL终止符。

char hello[6];
hello [0] = 'H';
hello [1] = 'e';
hello [2] = 'l';
hello [3] = 'l';
hello [4] = 'o';
hello [5] = '\0';

char world[6];
world [0] = 'W';
world [1] = 'o';
world [2] = 'r';
world [3] = 'l';
world [4] = 'd';
world [5] = '\0';

还是 char hello[] = "Hello"; - Jonathan Leffler
@JonathanLeffler 是的。但你早已知道了 :-) 那么你是在建议一种方法胜过另一种方法吗?无论哪种情况,我认为使用 const 来指示字符串内容不应被更改是很好的。 - kaylum
char hello[] = "Hello"; 并不是创建一个字符串常量,它是一个自动大小且以 null 结尾的可修改字符数组。当然,优化编译器可能会将写出的初始化转换为等效的初始化程序,但这绝对不是 const -- 虽然可以添加 const。此外,指针和字符串字面值使用的存储空间可能比数组更多;虽然在大多数系统上不是主要考虑因素。您还可以注意到,C 允许 char hello[5] = "Hello"; 但 C++ 不允许。这是给 OP 的额外信息。 - Jonathan Leffler
它不是NULL,而是ASCII-NUL ('\0')。NULL是空指针,可以(应该?!)是void *,你很可能不想将其分配给char - too honest for this site

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接