我正在关注Kernighan和Ritchie的C书,但是我在使用弦乐时遇到了一些困难.
在下面的代码中,似乎我的字符串,虽然从用户输入通过getchar()包含额外的,我会说是垃圾字符,在null(\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;
}
Run Code Online (Sandbox Code Playgroud)
这是输出逐个显示字符数组的每个元素.它意味着以下内容:
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) =
Run Code Online (Sandbox Code Playgroud)
你看元素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) =
Run Code Online (Sandbox Code Playgroud)
(我仍然不确定换行符在哪里.是不是ascii字符#10?)
再次,威士忌探戈狐步舞.
这里发生了什么?
更新
因此,根据下面的答案,当我将我的字符数组设置为100或200个元素时,输出之间的差异实际上是巧合 - 我只是在未初始化的内存中使用垃圾/噪音.
我需要明确地终止我的数组,\0正如答案敏锐地指出的那样.
在本练习中,如果您希望在输入后字符串中存在空字符,那么您需要自己添加它.
您正在观察奇数字符,因为C中的变量和数组未初始化:它们可以包含任何垃圾值,可能包括随机放置的空字符.
当您更改数组大小时,您可能会观察到不同的输出,但不要指望任何合理的,预期的或可重复的行为 - 它是未定义的 - 因为这些数组值可以是任何值.