Путаница, перепроверка функции ungetc

Я не понимаю, как работает эта программа?

char c;
int i;
for(i=1;i<=5;i++)
{
     scanf("%c",&c);
     printf("%c",c);
     ungetc(c,stdin);
}

Вывод программы является символом, который вводится впервые, печатается 5 раз.

a
aaaaa

По сообщению SO В чем разница между putc и ungetc? ungetc помещает что-то обратно во входной буфер.

Так что в этой программе во время первой итерации scanf() принимает ввод с клавиатуры и printf() отображает это и затем ungetc() возвращает тот же символ во входной буфер.

Но во время второй итерации вход не принимается, поэтому я предполагаю, printf() печатает символ, который был вставлен во входной буфер ungetc(),

Может кто-нибудь объяснить, как именно работает эта программа?

2 ответа

Решение

Согласно справочной странице ungetc()

ungetc() выталкивает c обратно в поток, приведите к unsigned char, где это доступно для последующих операций чтения.

Так что, в принципе, что угодно char Вы вводите в первый раз, что читается в c переменная, и после печати то же значение передается во входной буфер. Сейчас, scanf() читает из входного буфера, поэтому значение выдвигается ungetc() доступно для следующего scanf() читать это. Поэтому, scanf() не просит ввода пользователя.

Теперь, когда цикл запускается 5 раз, вы встретите 5 scanf()s, все читают первые входные данные и печатают одинаково 5 раз.

Тем не менее, всегда проверяйте возвращаемое значение scanf() чтобы обеспечить его успех.

Это происходит:

  • Ваш вклад: a\n
  • scanf читать a оставлять позади \n,
  • printf Распечатать a,
  • ungetc отталкивать a в буфер ввода и теперь вход снова a\n,
  • Повторите это 5 раз.
Другие вопросы по тегам