我正在关注 Kernighan 和 Ritchie 的 C 书,但在处理字符串时遇到了一些困难。
在下面的代码中,似乎我的字符串虽然是从用户输入的,但在 null ( ) 字符getchar()
之前包含额外的,我想说的是垃圾字符。\0
这是代码:
#include <stdio.h>
main() {
char s[200];
int c, i;
printf("Enter input string:\n");
for (i = 0; ( c = getchar()) != '\n'; i++) {
s[i] = c;
}
printf("Contents of input string:\n");
for (i = 0; s[i] != '\0'; i++) {
printf("%d: (%d) = ", i, s[i]);
putchar(s[i]);
printf("\n");
}
return 0;
}
这是一个一个显示字符数组的每个元素的输出。这意味着以下内容:
Array_element: (ascii_number) = ascii_character
0: (72) = H
1: (101) = e
2: (108) = l
3: (108) = l
4: (111) = o
5: (32) =
6: (87) = W
7: (111) = o
8: (114) = r
9: (108) = l
10: (100) = d
11: (33) = !
12: (-1) = ?
13: (127) =
你看到元素 12 和 13 了吗?(元素 14 可能是空字符\0
)。威士忌酒。探戈。狐步舞。
这是真正的关键,如果我将字符数组定义为只有100 个元素,而不是 200 个,那么输出是合理的。例如,如果我简单地替换
char s[200]
和
char s[100]
那么输出如下:
0: (72) = H
1: (101) = e
2: (108) = l
3: (108) = l
4: (111) = o
5: (32) =
6: (87) = W
7: (111) = o
8: (114) = r
9: (108) = l
10: (100) = d
11: (33) = !
12: (9) =
(我仍然不确定换行符在哪里。那不是 ascii 字符#10吗?)
再次,威士忌探戈狐步舞。
这里发生了什么?
更新
因此,根据下面的答案,当我将字符数组的大小设置为 100 或 200 个元素时,输出的差异似乎真的是巧合——我只是在未初始化的内存中处理垃圾/噪声。
\0
正如答案敏锐地表明的那样,我需要明确地终止我的数组。