当我为'scanf'输入一个字符时,我遇到了这个循环的问题。循环永远不会停止。但是当我输入一个数字时,一切都很好。
这就是守则:
#include <stdio.h>
#include <stdlib.h>
int main() {
int x;
printf("Enter 1 Or 2\n");
scanf("%i",&x);
while (x!=1 && x!=2) {
printf("Please Enter A Right Value \n");
scanf("%i",&x);
}
printf("Finish");
}
答案 0 :(得分:1)
当您输入字符时,scanf
实际上会尝试从stdin
获取那些错误的字符输入,但因为它不符合转换规范,只要它失败。然后它在stdin中保留那些错误的输入。下次scanf
因错误输入而再次失败。因此,在尝试使用scanf
再次获取输入之前,需要清除它。同时检查scanf
的返回值,如果无法清除stdin
。
提供的代码检查EOF
并返回scanf
的值,标准明确说明了scanf
的返回值: -
<强> 7.21.6.2p16 强>
如果是
fscanf
函数,则返回 宏EOF
的值 输入失败发生在第一次转换(如果有)之前 完成 即可。否则,函数返回输入的数量 分配的项目,可能少于提供的项目,或 甚至 如果早期匹配失败,则为零 。
代码类似于 this 。 (这是使用scanf
)。
更好地使用fgets
。你可以轻松,更好地控制错误的输入。使用fgets
,您将读取整行,然后使用strtol
或strtoul
解析来自它的整数输入。是的,如果是整数输入,那么也会出现这种情况 - 您需要检查解析的long或unsigned long是否具有适当的大小,以便它们可以保存在int
变量中。