当我不输入数字时,为什么会出现无限循环?

时间:2018-05-28 06:09:52

标签: c loops while-loop scanf

当我将'q'作为grade输入时,它会无限运行。

#include <stdio.h>
#include <stdbool.h>

int main(void) {
    int grade;
    bool flag = true;

    while (flag) {
        puts("-----------------------------"); // comment
        printf("What's your grade out of 10? ");
        scanf(" %d", &grade);

        switch (grade) {
          case 10:
          case 9:
          case 8:
          case 7:
          case 6:
            printf("Pass\n");
            break;
          case 5:
            printf("Fail\n");
            break;
          case 4:
            printf("Fail\n");
            break;
          case 3:
            printf("Fail\n");
            break;
          case 2:
            printf("Fail\n");
            break;
          case 1:
            printf("Fail\n");
            break;
          case 0:
            printf("Fail\n");
            break;
          default:
            printf("Illegal Grade\n");
            flag = false;
            break;
        }
    }
    return 0;
}

2 个答案:

答案 0 :(得分:4)

scanf(" %d",&grade);

它在字符串中扫描int。 &#34; Q&#34;不是int。当您输入&#34; q&#34;时,变量grade的值保持不变。您必须检查scanf的返回值以验证填充占位符的数量。

if (scanf(" %d",&grade) != 1) {
    printf("Illegal Grade\n");
    exit(1); // or break
}

其他部分都可以。

答案 1 :(得分:3)

键入无法解析为整数的内容时,

scanf(" %d", &grade);失败。 grade未被修改,因此如果转换错误立即发生并且行为未定义,则它未初始化,否则您将获得与上一次相同的值和行为。

有问题的输入保留在输入流中,因此当代码在while循环中再次执行时会发生同样的事情,因此无限循环。

您想测试转换是否成功,如果不是,则放弃输入:

#include <stdio.h>
#include <stdbool.h>

int main(void) {
    int res, c, grade;
    bool flag = true;

    while (flag) {
        puts("-----------------------------"); // comment
        printf("What's your grade out of 10? ");
        res = scanf("%d", &grade);
        if (res == EOF)
            break;
        if (res == 0) {
            printf("Invalid input\n");
            /* discard the offending line of input */
            while ((c = getchar()) != EOF && c != '\n')
                continue;
            /* try again */
            continue;
        }

        switch (grade) {
          case 10:
          case 9:
          case 8:
          case 7:
          case 6:
            printf("Pass\n");
            break;
          case 5:
          case 4:
          case 3:
          case 2:
          case 1:
          case 0:
            printf("Fail\n");
            break;
          default:
            printf("Illegal Grade\n");
            flag = false;
            break;
        }
    }
    return 0;
}