1

当我输入字母'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;
}
4

2 回答 2

4
scanf(" %d",&grade);

它以字符串形式扫描int。“q”不是 int。当您输入“q”时,变量的值grade保持不变。您必须检查返回值scanf以验证已填充占位符的数量。

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

其他部分没问题。

于 2018-05-28T06:14:56.317 回答
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;
}
于 2018-05-28T06:23:27.073 回答