while语句中的无限循环

时间:2012-01-10 18:03:57

标签: c

以下是我的代码

的摘录
scanf("%d", &s);

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

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

5 个答案:

答案 0 :(得分:5)

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

char buf[1000];

// ...

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

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

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

答案 1 :(得分:0)

为什么使用while循环?你想要show_warning();被召唤一次,还是反复?如果您回答一次,那么您只需要一个if语句。

答案 2 :(得分:0)

当没有scanf成功时会发生什么?变量s保持不变(如果没有初始化,可能带有未定义的值)。您应该设置它,或更改while

的条件

你真的应该学会编译并启用警告和调试信息(例如Linux上的gcc -Wall -g)并使用调试器(例如Linux上的gdb

答案 3 :(得分:0)

是什么让你认为它循环直到无限?

如果您没有输入数字,则只会收到警告消息,因为它没有读取令牌。

更改&&到||虽然是一种确保它会运行到无穷大的某种方式,因为你的循环永远不会破坏。

您可能想要一条替代消息,提示用户在输入数字但不输入1或2时输入数据?

答案 4 :(得分:0)

我假设你在输入非整数时遇到问题。这是因为scanf在缓冲区中留下了不匹配的字符,因此后续调用会看到相同的输入和循环。

您需要做的是,如果scanf调用返回任何数字,则其他1是:使用scanf("%c",&somechar)读取该字符,以便您可以打印它并告诉用户它不被接受。然后将删除未接受的输入,以便下一次调用scanf将为您提供下一个输入,而不是您在上一次迭代中看到的输入。