当我在一个地方输入一个角色时,循环永远不会停止

时间:2017-12-29 12:03:18

标签: c

当我为'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");
}

1 个答案:

答案 0 :(得分:1)

当您输入字符时,scanf实际上会尝试从stdin获取那些错误的字符输入,但因为它不符合转换规范,只要它失败。然后它在stdin中保留那些错误的输入。下次scanf因错误输入而再次失败。因此,在尝试使用scanf再次获取输入之前,需要清除它。同时检查scanf的返回值,如果无法清除stdin

提供的代码检查EOF并返回scanf的值,标准明确说明了scanf的返回值: -

<强> 7.21.6.2p16

  

如果是fscanf函数,则返回 EOF的值   输入失败发生在第一次转换(如果有)之前   完成 即可。否则,函数返回输入的数量   分配的项目,可能少于提供的项目,或 甚至   如果早期匹配失败,则为零

代码类似于 this 。 (这是使用scanf)。

更好地使用fgets。你可以轻松,更好地控制错误的输入。使用fgets,您将读取整行,然后使用strtolstrtoul解析来自它的整数输入。是的,如果是整数输入,那么也会出现这种情况 - 您需要检查解析的long或unsigned long是否具有适当的大小,以便它们可以保存在int变量中。