我在下面有一个具体的例子,如果输入整数(参见output1),它可以正常工作,当我尝试使用scanf函数调用中的%d说明符扫描char时,我得到下面的output2。
所以,我的问题是如果输入一个char我希望类型说明符应该将它转换为等效的int值,如果不是垃圾值,即使在任何一种情况下它应该print / segfault。但是,在这里我得到了连续的打印,我认为这是错误的,因为scanf每次都被绕过。我很不确定背景中发生了什么,并且想知道同样的事情。
#include <stdio.h>
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)用于不同类型,但我想知道后台会发生什么,如果有的话。感谢
答案 0 :(得分:1)
您可以将scanf检查为@Some programmer dude。您可以比较成功填充的计数参数(感谢@chux)
在你的情况下,scanf没有找到任何整数值,到达输入的末尾并返回EOF,保持a
变量不受影响。
失败时它会返回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
未初始化。