【发布时间】:2020-06-25 10:44:22
【问题描述】:
我试图从 C 中的标准输入中获取一个字符串。所以我尝试使用最愚蠢的东西:
int main(){
int j;
char name[20];
printf("Who are you? ");
fgets(name,20,stdin);
printf("Glad to meet you, %s",name);
for(j=0;j<20;j=j+1){
printf(" %d = %c\n ", j, name[j]);
}
}
所有这些奇怪的字符都出现了:
Who are you? Hana
Glad to meet you, Hana
0 = H
1 = a
2 = n
3 = a
4 =
5 =
6 =
7 =
8 = Ŕ
9 = ■
10 = `
11 =
12 = Ý
13 = o
14 =
15 = v
16 = P
17 =
18 = @
19 =
发生了什么?
【问题讨论】:
-
数组没有初始化——它只是垃圾——不管这些内存位置发生了什么。在 C 中,您必须显式初始化本地(自动)变量。
-
这很正常。您的数组最多可以容纳 20 个字符,但它不会全部使用它们。有效部分是直到第一个空字符
name[4]在您的情况下的字符。其余的都是单元化的,但你通常不关心它们。 (这 20 个字符包括空字符,因此您的名称最多可以有 19 个字符,fgets将确保这一点。) -
printf格式%c未正确显示终止 NUL 字符 ('\0')。使用例如printf(" %d = %c (%d)\n ", j, name[j], (int)name[i]);来查看使终止 NUL 明显的字符代码。 -
@MOehm:
name[4] == '\n'— 见印刷。name[5] == '\0'之后的内容就是垃圾。 -
@JonathanLeffler:是的,没错。错过了尾随的换行符。但是我的评论的编辑期已经结束,所以我会让我的错误保持不变......