C – читать scanf до feof (stdin), не выводить ошибку

Я использую функцию scanf () в своей программе для сканирования целого числа. То, как я это делаю:

while (!feof (stdin)) if (scanf("%d", &height) != 1) { puts("Wrong input!"); return 1; } 

Проблема в том, что после фактического выполнения EOF я получаю неправильный ввод и возвращает 1 из-за того, что scanf не возвращается 1. Как мне решить эту проблему?

Поскольку документация для состояний scanf , она вернет количество элементов, успешно сопоставленных и назначенных. Это может быть количество предметов, которые вы дали, если они были полностью успешными или любое число меньше этого, вплоть до нуля, если оно не соответствовало вводу. В случае EOF он вернет EOF. Итак, проверьте это!

 int result = scanf("%d", &height); if (result != EOF && result != 1) { // We've failed! } 

С этим подходом существует много проблем. (EOF не активен до тех пор, пока не попытается прочитать, текстовый ввод типа «A» создает бесконечный цикл и т. Д.) Вместо этого:

 char buf[100]; while (fgets(buf, sizeof buf, stdin) != NULL) { if (sscanf(buf, "%d", &height) != 1) { puts("Wrong input!"); return 1; } do_something(height); } return 0;