По-разному ли обрабатывают поток scanf и getchar?

Я не понимаю, как по-разному обрабатывают поток 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 во внешнем цикле обрабатывают эту ситуацию по-разному?


person edhu    schedule 02.03.2016    source источник
comment
getchar во внешнем цикле съедает q. Добавьте putchar(ch) непосредственно перед внутренним циклом, чтобы устранить проблему. С другой стороны, scanf("%d") при недопустимом вводе, таком как символ, завершится ошибкой и вернет 0, оставив символ (недопустимый ввод) в самом stdin.   -  person Spikatrix    schedule 02.03.2016


Ответы (1)


Когда вы используете scanf, чтобы попытаться прочитать целое число, и вы вводите некоторый ввод, который не является целым числом, тогда scanf завершится ошибкой и не вернет 1. Однако он оставит вход нетронутым, он не будет ничего извлекать из ввода, оставив все это вашему внутреннему циклу для обработки и печати.

Если вы используете getchar во внешнем цикле, он фактически будет использовать один символ, независимо от того, какой это символ, и тогда внутренний цикл не увидит этот символ, поскольку он больше не существует во входном буфере.

person Some programmer dude    schedule 02.03.2016