【问题标题】:confusion regrading ungetc function混淆重新分级 ungetc 功能
【发布时间】:2015-07-10 12:33:50
【问题描述】:

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

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() 推入输入缓冲区的字符。

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

【问题讨论】:

  • 我认为按回车键时添加的换行符会妨碍您。
  • 您实际上解释得很好,只需删除“我在猜测”即可。 scanf() 从输入缓冲区读取。 ungetc() 已经放了一些东西,所以不需要等待更多的输入。

标签: c input scanf ungetc


【解决方案1】:

根据ungetc()man page

ungetc()c 推回流,转换为 unsigned char,供后续读取操作使用。

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

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

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

【讨论】:

  • 如果我声明 char x='a' 并将其放入 ungetc 函数 ungetc(x,stdin) 并将其置于 scanfprintf 之间会怎样。是否应该显示a 5 次?
  • @Ravi 你为什么不试试? :-)
  • 输出是raaaa 其中r 是我输入的第一个字符
  • @Ravi 你了解 o/p 吗?第一次迭代打印扫描的字符,即r,然后,您正在使用'a',因此,对于剩余的4次迭代,它将扫描从缓冲区中'a'并打印它.
  • 明白!感谢您的澄清
【解决方案2】:

这正在发生:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-08
    • 1970-01-01
    • 2021-05-09
    • 1970-01-01
    • 2012-10-15
    • 1970-01-01
    相关资源
    最近更新 更多