Я не понимаю, как по-разному обрабатывают поток scanf и getchar, ниже приведен пример кода:
while(scanf("%d", &input) != 1)
{
while((ch = getchar()) != '\n')
{
putchar(ch);
}
printf("\nThis is wrong\n");
}
printf("That is right\n");
Это простая программа, используемая для проверки того, является ли ввод целым числом. Внутренний цикл while используется для отображения каждого неправильного входного значения перед нажатием Enter. Когда я ввел случайную строку, например:
qwert
putchar распечатает точную строку. Однако если я заменил
while(scanf("%d", &input) != 1)
с участием
while((ch = getchar()) != '\n')
и распечатайте ту же самую строку, первая буква «q» выпадает. Итак, мой вопрос: как scanf и getchar во внешнем цикле обрабатывают эту ситуацию по-разному?
getchar
во внешнем цикле съедаетq
. Добавьтеputchar(ch)
непосредственно перед внутренним циклом, чтобы устранить проблему. С другой стороны,scanf("%d")
при недопустимом вводе, таком как символ, завершится ошибкой и вернет 0, оставив символ (недопустимый ввод) в самомstdin
. - person Spikatrix   schedule 02.03.2016