下面是我的代码中的一段代码
scanf("%d", &s);
while(s!=1 && s!=2) {
if(scanf("%d", &s) != 1) {
show_warning(); //just print some info msg
}
}其思想是,只有当用户输入1,2以外的值并且输入值仅为整数时,才执行show_warning函数。有了上面的代码,它在无限循环中跳跃。如何解决这个问题?
发布于 2012-01-11 02:14:57
问题是失败的输入操作不会从流中提取任何字符(并且您将一遍又一遍地读取无效输入),因此您必须手动清空输入。例如:
char buf[1000];
// ...
if(scanf("%d", &s) != 1)
{
puts("Error, try again: ");
fgets(buf, 1000, stdin);
}正如我在other question中所建议的,如果您从一开始就使用fgets始终读取一行,并在以后处理它,那么您就可以克服这个问题。
(同样的原理也适用于C++:首先读取整行,以便输入流可以继续,然后再处理该行,看看它是否有效。)
发布于 2012-01-11 02:06:36
为什么要使用while循环?您希望show_warning();被调用一次,还是重复调用?如果你回答了一次,那么你只需要一个If语句。
发布于 2012-01-11 02:06:39
另外,当没有scanf成功时会发生什么?变量s保持不变(如果您没有对其进行初始化,则可能具有未定义的值)。您应该设置它,或者更改while的条件!
而且你真的应该学会在编译时启用警告和调试信息(例如Linux上的gcc -Wall -g )和使用调试器(例如Linux上的gdb )
https://stackoverflow.com/questions/8808145
复制相似问题