我不明白这个程序是如何运作的?
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()
推入输入缓冲区的字符。
有人可以清楚地解释这个程序究竟是如何运作的吗?
答案 0 :(得分:2)
根据ungetc()
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
。 ungetc
将a
推回输入缓冲区,现在输入再次为a\n
。 5
次。