以下是我的代码
的摘录scanf("%d", &s);
while(s!=1 && s!=2) {
if(scanf("%d", &s) != 1) {
show_warning(); //just print some info msg
}
}
这个想法是只有当用户输入不同的1,2并且输入的值只是整数时才执行show_warning功能。 使用上面的代码,它会在无限循环中跳转。如何解决?
答案 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
将为您提供下一个输入,而不是您在上一次迭代中看到的输入。