scanf(%d,..)在一个循环中,当给定一个char时没有阻塞

时间:2011-06-29 20:10:54

标签: c scanf

我写了这段代码:

 char str[10];

    while(1)
    {
       scanf("%d",str);  
    }

如果给出char(例如'a'),循环就会继续运行而不停止并要求更多输入(scanf不会突然阻塞)

为什么? :-)

6 个答案:

答案 0 :(得分:3)

因为a不是十进制整数。 scanf将尝试读取但失败并且不会使其内部指针前进,因此它将无休止地尝试读取与小数相同的a并失败。

考虑以下计划:

int d;
char c;
scanf("%d", &d);
scanf("%c", &c);

如果您输入a,则第一个scanf将失败,第二个将a'读入c。这应该解释问题:)

答案 1 :(得分:1)

因为它不能将'a'强制转换为整数形式,所以它“将它放回到流中”(这里没有实际的流,只是一种语音方式)。然后你的无限循环使它再次尝试相同的程序。无休止。

答案 2 :(得分:0)

您的格式字符串为%d而不是%sScanf()正在查找整数,而不是字符串。你的循环一直在继续,因为它说while(1)所以它永远不会结束。

答案 3 :(得分:0)

它可能正在尝试读取int,但随后它注意到数据流中没有int,因此它会立即返回。如果它不消耗输入流,那么它将重复这样做。

答案 4 :(得分:0)

输入缓冲区有a....

你的scanf尝试读取int:

     a....
     ^
     oops : cannot be int. stop scanfing

在下一个循环中,a仍在那里。

众所周知,

scanf很难正确使用,但必须始终检查其返回值:

int chk;
chk = scanf(...); /* pseudo-code */
if (chk != EXPECTED_VALUE) { /* HANDLE ERROR! */ }

答案 5 :(得分:0)

要解决此问题,您需要检查以确保scanf()实际读取您想要的值。 scanf()返回成功读取的项目数。因此,存储返回值,检查它是否为1.如果它为0,则读取0个项目,您需要在再次尝试之前清空流。 (编辑:好吧,也许不一定是空的,但至少要通过流中的违规数据)

正如其他人所说,它试图读取一个整数,看'a',无法读取整数,但是再次尝试时'a'仍在流中。