我写了这段代码:
char str[10];
while(1)
{
scanf("%d",str);
}
如果给出char
(例如'a'),循环就会继续运行而不停止并要求更多输入(scanf不会突然阻塞)
为什么? :-)
答案 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
而不是%s
。 Scanf()
正在查找整数,而不是字符串。你的循环一直在继续,因为它说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'
仍在流中。