Почему существует бесконечный цикл, когда я не вводю число? - PullRequest
0 голосов
/ 28 мая 2018

Когда я ввожу букву '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 голосов
/ 28 мая 2018

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;
}
0 голосов
/ 28 мая 2018
scanf(" %d",&grade);

Сканирует int в строке."q" не int.При вводе «q» значение переменной grade остается без изменений.Вы должны проверить возвращаемое значение scanf, чтобы проверить количество заполненных заполнителей.

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

Другие части в порядке.

...