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;
}