Ограничение входа в C

У меня проблема с ограничением ввода пользователя. Я хочу, чтобы целыми числами были 1,2 или 3. Do .. while цикл выполняет задание для недопустимых целых входов, но как я игнорировать входы string / character? Мне также нужно спросить пользователя повторно, если вход недействителен.

Обновить:

int problem; printf("Please select the problem that you want to solve:\n"); printf("\t 1-Problem 1\n"); printf("\t 2-Problem 2\n"); printf("\t 3-Problem 3\n"); while( scanf("%d", &problem)==0 && (problem!=1 || problem !=3 || problem !=2)) {int c; while((c=getchar())!='\n' && c!=EOF); printf("Please select the problem that you want to solve:\n"); printf("\t 1-Problem 1\n"); printf("\t 2-Problem 2\n"); printf("\t 3-Problem 3\n"); } 

Это выглядит беспорядочно из-за множественных printf. Я просто не хочу длинных кодов в одну строку. Во всяком случае, я хотел только 1,2 или 3 в качестве входных данных. Если введенный ввод недействителен, программа запрашивает пользователя снова, пока пользователь не введет правильный ввод.

Код работает для недопустимых входов, таких как слова, буквы, символы и т. Д. Однако, если пользователь вводит 1.2, он исходит из 1, что не должно быть. 0 не принимается. Что я могу сделать с моим кодом, чтобы ограничить их?

scanf с %d завершится с ошибкой и вернет 0 в случае недопустимых входов (например, символов). Итак, просто проверьте, не сработал ли scanf , проверив возвращаемое значение.

 while(scanf("%d",&num)==0 && (num<=1 || num >=3)) //Invalid input if this is true { int c; while((c=getchar())!='\n' && c!=EOF); //Clear the stdin printf("Invalid input. Try again\n"); } 

Линия

 while((c=getchar())!='\n' && c!=EOF); 

очищает стандартный stream ввода, так что scanf не считывает неверный ввод снова и снова, что приводит к бесконечному циклу.

Обратите внимание, что scanf может возвращать EOF . Это заставит программу думать, что пользователь ввел правильный ввод. Вы можете добавить проверку, чтобы проверить, не является ли возвращаемое значение из scanf не EOF . Кроме того, вы должны инициализировать num числом, которое не является 1,2 или 3, чтобы избежать вызова неопределенного поведения.