使用%d扫描字符

我在下面有一个具体的例子,如果输入整数(参见output1),它可以正常工作,当我尝试使用scanf函数调用中的%d说明符扫描一个字符时,我得到下面的输出2。

所以,我的问题是如果输入一个char我希望类型说明符应该将它转换为等效的int值,如果不是垃圾值,即使在任何一种情况下它应该print / segfault。 但是,在这里我得到了连续的打印,我觉得这是错误的,因为scanf每次都被绕过。 我很不确定在后台发生了什么,并且想知道同样的事情。

#include  int main() { int a; while (1){ printf("enter a number:"); scanf("%d", &a); printf("entered number is %d\n", a); } return 0; } 

输出1

 > enter a number:1 > entered number is 1 > enter a number: > 3 > entered number is 3 > enter a number:4 > entered number is 4 > enter a number:5 > entered number is 5 enter a number: 

输出2 :用于输入a

 > enter a number:entered number is 32767 > enter a number:entered number is 32767 > enter a number:entered number is 32767 > enter a number:entered number is 32767 > enter a number:entered number is 32767 > enter a number:entered number is 32767 > enter a number:entered number is 32767 > enter a number:entered number is 32767 > enter a number:entered number is 32767 

PS:我知道这是一个愚蠢的问题,询问在无效情况下会发生什么情况,其中类型说明符是无意的(在这种情况下为%d)用于不同的类型,但我想知道在后台发生了什么,如果有的话。 谢谢

您可以将scanf检查为@Some程序员dude 。 您可以比较成功填充的计数参数(感谢@chux )

在您的情况下,scanf没有找到任何整数值,到达输入的末尾并返回EOF,保持变量不变。

失败时它将返回EOF(请阅读http://www.cplusplus.com/reference/cstdio/scanf/#return )。

 if(scanf("%d", &a) == 1) //Check if exactly one parameter was read. printf("entered number is %d\n", a); 

对于字符,最好使用getch()或者至少在scanf上请求"%c"

 if(scanf("%c", &a) == 1) printf("entered key was %d\n", a); 

您收到的“垃圾”值是程序内存中的值,因为a未初始化。