while语句中的无限循环

sum*_*erc 2 c

这是我的代码中的一个片段

scanf("%d", &s);

while(s!=1 && s!=2) {
    if(scanf("%d", &s) != 1) {
        show_warning(); //just print some info msg
    }
}
Run Code Online (Sandbox Code Playgroud)

这个想法是只有当用户输入不同的1,2并且输入的值只是整数时才执行show_warning功能.使用上面的代码,它会在无限循环中跳转.如何解决?

Ker*_* SB 5

问题是失败的输入操作不会从流中提取任何字符(并且您将一遍又一遍地读取无效输入),因此您必须手动清空输入.例如:

char buf[1000];

// ...

if(scanf("%d", &s) != 1)
{
    puts("Error, try again: ");
    fgets(buf, 1000, stdin);
}
Run Code Online (Sandbox Code Playgroud)

正如我在另一个问题中建议的那样,如果你fgets从一开始就使用读取一行并稍后处理它,你就克服了这个问题.

(在C++中也是如此:首先读取整行,以便输入流可以继续,然后处理该行以查看它是否有效.)