这个问题在这里已有答案:
当我为'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");
}
好吧,当你输入字符时,scanf
实际上试图从stdin
获取那些错误的字符输入,但因为它不符合转换规范,只要它失败。然后它在stdin中保留那些错误的输入。下次scanf
由于那些错误的输入再次失败。因此,在尝试使用scanf
再次获取输入之前,需要清除它。还要检查scanf
的返回值,如果它失败,请清除stdin
。
提供的代码检查EOF
并返回值scanf
标准明确说明scanf
的返回值: -
如果在第一次转换(如果有)完成之前发生输入故障,则
fscanf
函数返回宏EOF
的值。否则,该函数返回分配的输入项的数量,如果早期匹配失败,则可以少于提供的数量,甚至为零。
代码将类似于this。 (这是使用scanf
)。
甚至更好地使用fgets
。你可以轻松,更好地控制错误的输入。使用fgets
,您将读取整行,然后使用strtol
或strtoul
解析它的整数输入。是的,如果是整数输入,那么也会出现这种情况 - 您需要检查解析的long或unsigned long是否具有适当的大小,以便它们可以保存在int
变量中。