Мне не нравятся предупреждения. Я удаляю их как можно больше.
Иногда, когда под давлением для окончания задания я оставляю некоторых из них. Я редко оставляю их все же. Я чувствую себя подобно Вам, грязный, если существует кто-либо оставленный.
EOF
- это просто макрос со значением (обычно -1). Вы должны что-то протестировать против EOF
, например, результат вызова getchar ()
.
Один из способов проверить конец потока - использовать feof
.
if (feof(stdin))
Обратите внимание, что состояние «конец потока» будет установлено только после неудачного чтения.
В вашем примере вам, вероятно, следует проверить возвращаемое значение scanf и Если это означает, что поля не были прочитаны, проверьте наличие конца файла.
Другая проблема заключается в том, что вы читаете с помощью scanf ("% f", & input); только
. Если пользователь вводит что-то, что не может быть интерпретировано как число с плавающей запятой C, например «пи», вызов scanf ()
не будет назначать ничего для input
и выиграет Прогресс оттуда. Это означает, что он будет пытаться продолжать читать «пи», и не удается.
Учитывая изменение в while (! feof (stdin))
, которое правильно рекомендуют другие плакаты, если вы наберете «пи», возникнет бесконечный цикл печати прежнего значения of input
и выводит приглашение, но программа никогда не обработает новый ввод.
scanf ()
возвращает количество сделанных ею присваиваний входным переменным. Если присваивание не было выполнено, это означает, что он не нашел числа с плавающей запятой, и вам следует прочитать дополнительные данные, например, char string [100]; scanf ("% 99s", string);
. Это приведет к удалению следующей строки из входного потока (до 99 символов, в любом случае - дополнительный char
предназначен для нулевого терминатора в строке).
Вы знаете,
в качестве отправной точки вы можете попробовать заменить
while(!EOF)
на
while(!feof(stdin))
EOF
- это константа в C. Вы не проверяете фактический файл на наличие EOF. Вам нужно сделать что-то вроде этого
while(!feof(stdin))
Вот документация к feof . Вы также можете проверить возвращаемое значение scanf . Он возвращает количество успешно преобразованных элементов или EOF
, если он достигает конца файла.
Вы хотите проверить результат scanf (), чтобы убедиться, что преобразование было успешным; если его не было, то верно одно из трех:
Пример:
int moreData = 1;
...
printf("Input no: ");
fflush(stdout);
/**
* Loop while moreData is true
*/
while (moreData)
{
errno = 0;
int itemsRead = scanf("%f", &input);
if (itemsRead == 1)
{
printf("Output: %f\n", input);
printf("Input no: ");
fflush(stdout);
}
else
{
if (feof(stdin))
{
printf("Hit EOF on stdin; exiting\n");
moreData = 0;
}
else if (ferror(stdin))
{
/**
* I *think* scanf() sets errno; if not, replace
* the line below with a regular printf() and
* a generic "read error" message.
*/
perror("error during read");
moreData = 0;
}
else
{
printf("Bad character stuck in input stream; clearing to end of line\n");
while (getchar() != '\n')
; /* empty loop */
printf("Input no: ");
fflush(stdout);
}
}