Обратите внимание, что когда scanf
получает неправильный ввод (например, вы вводите cat dog ), этот ввод остается в буфере ввода до тех пор, пока вы не предпримете шаги для его очистки.Таким образом, цикл продолжает повторять и отклонять один и тот же ввод, который все еще там.
Проще использовать fgets
и sscanf
, и если сканирование не удается, вы просто забыли входную строку и получили другую.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int a, b;
char str[42];
do {
printf("Enter 2 numeric values\n");
if(fgets(str, sizeof str, stdin) == NULL) {
exit(1);
}
} while(sscanf(str, "%d%d", &a, &b) != 2);
printf("Numbers are %d and %d\n", a, b);
}
Программный сеанс:
Enter 2 numeric values
cat dog
Enter 2 numeric values
cat 43
Enter 2 numeric values
42 dog
Enter 2 numeric values
42 43
Numbers are 42 and 43
Обратите внимание, что goto
является плохой практикой в C и должен использоваться только там, где нет другого способа построения кода - который обычно есть.