2

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

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

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

a
aaaaa

根据SO post putc和ungetc有什么区别? ungetc将一些东西放回输入缓冲区。

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

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

有人可以清楚地解释这个程序是如何工作的吗?

4

2 回答 2

3

根据手册ungetc()

ungetc()c回流,转换为无符号字符,可用于后续读取操作。

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

现在,当循环运行 5 次时,您将遇到 5scanf()秒,所有这些都读取第一个输入数据,并打印相同的 5 次。

也就是说,请始终检查 的返回值scanf()以确保其成功。

于 2015-07-10T12:36:28.017 回答
3

这正在发生:

  • 您的输入:a\n
  • scanfa留下\n
  • printf打印a
  • ungetc推回a输入缓冲区,现在输入又是a\n.
  • 重复这5几次。
于 2015-07-10T12:57:15.933 回答