Когда вы используете "%f"
в качестве строки формата для scanf
, он будет читать только те символы, которые допустимы для типа с плавающей запятой, и прекратит чтение, если обнаружит какие-либо другие символы.Поэтому, если кто-то наберет «abc», ничего не будет записано в judge1
, и эти символы останутся во входном буфере для повторного чтения.Затем вы застрянете в бесконечном цикле чтения тех же символов.
Кроме того, это выражение не имеет смысла:
judge1=a>96
>
имеет более высокий приоритет, чем ==
, таким образом, это эквивалентно:
judge1=(a>96)
При условии, что a
присвоено значение, a>96
сравнивает это значение с 96 и оценивает либо 0, либо 1. Затем вы присваиваете это значение judge1
перезаписывая прочитанное пользователем.Предполагая, что вы хотели использовать ==
, это тоже не имеет смысла.В этом случае judge1==0
или judge1==1
оценивается в зависимости от результата a>96
.Таким образом, приведенное выше выражение будет истинным, только если judge1
равно 1 и a
больше 96 или judge1
равно 0 и a
меньше или равно 96.
Другая проблема заключается в том, чтоa
никогда не присваивается значение.Похоже, у вас сложилось впечатление, что при вызове scanf("%f",&judge1);
первый прочитанный символ записывается в a
.Нет ссылки, которая вызывает это, поэтому a
остается неинициализированным.
Вместо этого вы хотите прочитать строку текста, используя fgets
, а затем strtof
, чтобы прочитатьfloat
.Функция strtof
принимает адрес указателя в качестве второго параметра, чтобы сообщить вам, где в строке остановлен синтаксический анализ.Так что, если этот указатель не указывает на нулевой терминатор в конце строки (или на символ новой строки, так как fgets
читает и сохраняет символ новой строки), то вы знаете, что прочитали символ не с плавающей запятой.
float judge1;
char line[100];
char *p;
int invalid_input;
do {
invalid_input = 0;
fgets(line, sizeof(line), stdin);
errno = 0;
judge1 = strtof(line, &p);
if (errno || ((*p != 0) && (*p != '\n')) || (judge1 < 0) || (judge1 > 10)) {
printf("Please input a valid score between 0 and 10:");
invalid_input = 1;
} else {
printf("The constentant got %.2f from the judge\n ",judge1);
}
} while (invalid_input);