混乱重塑ungetc功能

时间:2015-07-10 12:33:51

标签: c input scanf ungetc

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

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

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

a
aaaaa

根据SO帖子What is the difference between putc and ungetc? ungetc将某些东西放回输入缓冲区。

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

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

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

2 个答案:

答案 0 :(得分:2)

根据ungetc()

man page
  

ungetc()c推送回流,转换为unsigned char,可用于后续的读取操作。

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

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

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

答案 1 :(得分:2)

这种情况正在发生:

  • 您的输入:a\n
  • scanf阅读a,留下\n
  • printf打印a
  • ungetca推回输入缓冲区,现在输入再次为a\n
  • 重复此5次。