为什么scanf读取每个字母都为39?

时间:2019-07-12 04:43:47

标签: c scanf

我使用了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']

之类的内容时

{所有输入均以整数开头}

答案是正确的。我认为该代码仅读取整数,并且一旦获得其输入,它就会自行中断执行。

2 个答案:

答案 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