混淆 regrading ungetc 函数

confusion regrading ungetc function

我不明白这个程序是如何工作的?

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

程序的输出是- 第一次输入的字符被打印了5次。

a
aaaaa

根据 SO post What is the difference between putc and ungetc? ungetc 将某些内容放回输入缓冲区。

所以在这个程序中,在第一次迭代期间 scanf() 接受来自键盘的输入并 printf() 显示它,然后 ungetc() 将相同的字符推回输入缓冲区。

但是在第二次迭代期间没有输入被接受,所以我猜测 printf() 打印被 ungetc() 推入输入缓冲区的字符。

谁能清楚地解释一下这个程序究竟是如何工作的?

根据 ungetc()

man page

ungetc() pushes c back to stream, cast to unsigned char, where it is available for subsequent read operations.

所以,基本上,无论您第一次输入什么 char,它都会被读取到 c 变量中,并且在打印之后,相同的值会被推送到输入缓冲区。现在,scanf() 从输入缓冲区读取,因此 ungetc() 推送的值可供下一个 scanf() 读取。这就是为什么,scanf() 不是 询问 用户输入

现在,随着循环运行 5 次,您将遇到 5 个 scanf()s,它们都读取第一个输入数据,并打印相同的数据 5 次。

就是说,请始终检查 scanf() 的 return 值以确保它成功。

这正在发生:

  • 您的输入:a\n
  • scanfa留下\n
  • printf 打印 a
  • ungetc 推回 a 到输入缓冲区,现在输入又是 a\n
  • 重复此 5 次。