Как я могу продолжить цикл, когда я даю scanf () не цифру в качестве входа?

Я разработал простой пример. Здесь он получит целочисленное значение от пользователя и отобразит значение. Когда я передаю ввод символа вместо целого числа, я хочу пропустить процесс и снова попросить пользователя ввести его. Для этого я написал этот ниже код, но когда я даю ввод символов, он будет продолжать цикл, но, продолжая, он не будет запрашивать вход пользователя. Пожалуйста, дайте решение для этого.

#include  int main() { int n; while(1){ if(scanf("%d",&n)==0){ printf("Error:Checkyour input\n"); continue; } printf("the input =%d\n",n); } } 

вывод поступает следующим образом:

  Error:Checkyour input Error:Checkyour input Error:Checkyour input Error:Checkyour input Error:Checkyour input Error:Checkyour input 

Это происходит потому, что клавиша ENTER нажимает [a \n ], которая хранится во входном буфере и непрерывно вводит неверный ввод в [next] scanf() .

внесите следующие изменения в код.

  #include int main() //add the return type. { int n; while(1){ if(scanf(" %d",&n)==0){ while (getchar() !='\n'); //eat up all the _invalid_ input present in input buffer till newline printf("Error:Check your input\n"); continue; } printf("the input =%d\n",n); } return 0; //add the return value. } в  #include int main() //add the return type. { int n; while(1){ if(scanf(" %d",&n)==0){ while (getchar() !='\n'); //eat up all the _invalid_ input present in input buffer till newline printf("Error:Check your input\n"); continue; } printf("the input =%d\n",n); } return 0; //add the return value. } 

Что касается комментария г-на Джонатана Леффлера , пожалуйста, найдите более оптимизированную версию кода, также заботясь о EOF .

  #include int main() { int n; int retval = 0; while(1){ retval = scanf(" %d",&n); if (retval ==1) printf("the input =%d\n",n); else if (retval == 0) { while (getchar() !='\n'); printf("Error:Check your input\n"); continue; } else //includes EOF case break; } return 0; } в  #include int main() { int n; int retval = 0; while(1){ retval = scanf(" %d",&n); if (retval ==1) printf("the input =%d\n",n); else if (retval == 0) { while (getchar() !='\n'); printf("Error:Check your input\n"); continue; } else //includes EOF case break; } return 0; } 

Когда scanf() не может что-то преобразовать (например, вы набрали букву a вместо цифры), он оставляет символ, который он не может прочитать на входе, который должен обрабатываться другим вызовом ввода-вывода. Если это тот же самый scanf() , он снова не сработает, ad nauseam. Ваш код будет также неверно работать, если он получит EOF на стандартном входе.

У вас есть различные варианты, чтобы исправить это:

  1. Вы можете разбить цикл, когда scanf() не возвращает 1, останавливаясь при первой ошибке или EOF.
  2. Вы можете использовать getchar() для чтения, по крайней мере, символа, который остановил ввод, при необходимости прочитав следующую новую строку (или EOF).
  3. Вы можете использовать другой формат scanf() для чтения мусора: scanf("%*[-+0-9]") например, чтобы пропустить все символы, которые не являются частью целого. Обратите внимание, однако, что это может уйти -- на вход, так что это не все так безопасно. Может быть, scanf("%*[^ \n]") будет лучше. * Подавляет назначение, поэтому ему не нужно где-то размещать данные, которые читаются.