为什么无限循环中if条件下的scanf不能正常工作?
我试图在一个菜单选项字段的输入中做一个检查,但它会产生一个无限循环,没有出口,不允许我插入标准输入 菜单 检查输入为什么无限循环中if条件下的scanf不能正常工作?,c,scanf,C,Scanf,我试图在一个菜单选项字段的输入中做一个检查,但它会产生一个无限循环,没有出口,不允许我插入标准输入 菜单 检查输入 while (1) { printf("--> "); if ( scanf("%d", &operationNum) ) break; } 输出(I测试错误值) 发生这种情况的原因是您使用的是scanf(%d,…),它只接受数字作为输入,但您正在输入字符,如果您希望以字
while (1) {
printf("--> ");
if ( scanf("%d", &operationNum) )
break;
}
输出(I测试错误值)
发生这种情况的原因是您使用的是
scanf(%d,…)
,它只接受数字作为输入,但您正在输入字符,如果您希望以字符形式获取输入,则应使用%s
,而不是%dscanf将\n
保留在缓冲区中,因此需要将其删除
while (1) {
printf("--> ");
if ( scanf(" %d", &operationNum) )
break;
else getchar();
}
我的想法是强制用户输入一个数字,而不是一个字符。Scanf返回格式所需的参数数,否则返回0,在输入有效之前不允许退出。检查此@MichaeltLoL在这个小示例中做了什么?您没有显示您给这个程序的输入。在请求调试帮助时,请始终提供,包括重现问题所需的任何输入。scanf
在继续之前检查输入中的下一个字符是否匹配。在处理%d
时,如果下一个字符不能匹配,例如因为它是字母,则scanf
将该字符保留在输入流中并返回。因为还没有匹配项,所以它返回零。当您的循环再次调用scanf
时,它会在流中看到相同的字符,并再次返回零。这种情况将无限期地继续下去。要取得进展,必须读取流中的字符,从而使用它们并将其从流中删除。添加要读取的代码,直到(比如)读取新行字符。说明符前面的空格对于%c
有用,而对于%d
则不有用。还有else getchar()
只使用一个字符,您需要刷新直到\n
或EOF
:而((c=getchar())!='\n'&&c!=EOF)
@DavidRanieri将起作用,它将需要更多的迭代NOPS,它为每个非数字打印一个-->
,更多的迭代不是解决方案(至少不是干净的解决方案)。
--> gf
--> --> --> --> --> --> --> --> --> --> --> --> --> --> (...)
while (1) {
printf("--> ");
if ( scanf(" %d", &operationNum) )
break;
else getchar();
}