我正在修C程序课程。我不明白这些代码。
#include <stdio.h>
int main()
{
int c;
int ival;
printf("type : ");
c = getchar();
scanf("%d", &ival);
printf("c = %d\n", c); //65
printf("ival = %d\n", ival); //127
return 0;
}
例如,每当我输入 Abc 时,我都会 c = 65 ; ival = 1 。 为什么ival是1?
答案 0 :(得分:5)
ival
永远不会被初始化,所以它可以有任何价值。原因是c
正在接收'A'
(通过getchar()
)然后scanf
失败来读取一个数字(因为下一个字符是输入'b'
不是十进制数字),因此它永远不会触及ival
。
您可以检查scanf
的返回值,看它是否失败或成功:
if (scanf("%d", &ival) != 1)
printf("you need to enter a number\n");
else
printf("entered: %d\n", ival);
请注意,scanf
会返回成功阅读和分配的项的数量。例如,如果正确读取所有三个项目,则scanf("%d %f %c", ...)
将返回3. 1
1 请注意,已分配表示忽略的输入(例如具有赋值 - 抑制修饰符(*
)的输入)不计朝着scanf
的返回值(C11,7.21.6.2.10,16)。此外,%n
不会影响scanf
的返回值(C11,7.21.6.2.12)。
答案 1 :(得分:2)
使用Abc
时,getchar()
会显示A
,因此c
将保留A
的字符代码,恰好在您的计算机上为65 (这是A
)的ascii代码。
对于ival
,您可以获得任何内容:因为%d
上的scanf()
期望读取一个整数,而您没有提供一个,scanf()
提前返回,离开输入缓冲区中的bc
,因此在您调用ival
时从printf()
读取的值未定义:它可以打印任何内容。
答案 2 :(得分:0)
原因是您的程序会调用未定义的行为。A
会在getchar
读取bc
而scanf
未读取%d
{1}}期望读取一个整数,因此在遇到该字符时会立即停止读取并保持ival
未初始化。