为什么无限循环中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
,而不是
%d

scanf将
\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();
}