使用%d扫描char

时间:2017-06-20 18:28:47

标签: c format scanf

我在下面有一个具体的例子,如果输入整数(参见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)用于不同类型,但我想知道后台会发生什么,如果有的话。感谢

1 个答案:

答案 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未初始化。