我使用了scanf("%d" ,&a)
,但是出于好奇,我在输入控制台中输入了字母,但令我惊讶的是每次输出为39 ,为什么会这样?
我是语言新手,所以我制作了这个程序,该程序读取/扫描用户的输入并打印输出(某种复制粘贴程序)
为了适应,我使用整数作为变量值,但是在执行代码时,我没有输入整数,而是输入了字母[ex:-'a', 'aaaaaaa', 'afadfad', 'awsw121', 'a1'
],但是每次输出为39。
int a;
printf("what`s your age in years?\n");
scanf("%d" ,&a);
printf("your age is %d \n" , a);
每当我输入['1a' , '2afasfadfa' , '5awwee']
{所有输入均以整数开头}
答案是正确的。我认为该代码仅读取整数,并且一旦获得其输入,它就会自行中断执行。
答案 0 :(得分:4)
当scanf中有%d
并键入一个字符时,scanf不会读取任何内容。实际上,它返回的值是读取的0个元素。
您获得的39值可能是因为您在堆栈上声明了int a
,并且它将具有任何随机值。再次运行该程序可能会或可能不会更改此内存。
您可以通过将a
初始化为其他值(例如, int a = 5
,输出将始终为5。
此外,您应该始终检查scanf的返回值,以查看是否已实际阅读了期望的内容。
int a;
printf("what`s your age in years?\n");
if (scanf("%d" ,&a) != 1)
{
// handle error
}
printf("your age is %d \n" , a);
我认为代码只读取整数,并且只要它获得输入,它就会中断执行。
这并不完全正确。 scanf
与%d
将读取整数,其余字符将保留在缓冲区中。
因此,如果您用scanf
尝试另一个%d
,它将再次失败。
此方案的解决方案是完全读取缓冲区,然后将其丢弃。例如
int c;
...
while ((c = getchar()) != '\n' && c != EOF);
答案 1 :(得分:0)
scanf()返回成功的转换次数。如果用户键入数字,则将其转换并存储到变量中,并且如果用户输入的不是数字,则scanf()返回1,例如AA,scanf()将有问题的输入保留在标准输入缓冲区中并返回0,最后如果到达文件末尾(用户在Windows中输入^ Z输入或在UNIX中输入^ D),scanf()返回EOF