【问题标题】:Question about buffering, getchar() and scanf()?关于缓冲、getchar() 和 scanf() 的问题?
【发布时间】:2011-03-07 01:00:33
【问题描述】:

我正在学习 C 并且有一些问题。请看下面的图片:

在阅读高亮文本时,我很困惑。是不是这样:当用户开始输入一些输入时,输入直接并立即放入缓冲区中。而当按下回车键('\n')时,程序从缓冲区读取并获取输入,然后清除缓冲区?

如果是,假设在程序中,我使用:scanf("%d", &a_variable),然后输入123astring,然后从缓冲区中读取并清除123。所以,缓冲区中现在包含“astring”吗?

我说的对吗?还是我误会了什么?

【问题讨论】:

  • 严格来说是回车键。 :)
  • 您将有关缓冲的通用文本与特定实例 scanf 混合在一起,该实例甚至可能未使用读取缓冲区。您的问题无法回答,因为它取决于 scanf 的实现细节和它所属的 stdio 包。

标签: c buffer


【解决方案1】:

确实有两个缓冲区。 第一个是他们正在谈论的那个。它允许用户输入内容,然后删除等,而程序永远不会看到任何内容。 第二个缓冲区将保存剩余的“字符串”。

一个很好的想法是当按下 Enter 时第一个缓冲区传递到第二个缓冲区。第二个缓冲区由 scanf 读取。如果它是空的,程序会等待。

第二个缓冲区几乎总是在那里。如果不是,您必须在用户键入时准确地运行 scanf,即使在“无缓冲”情况下也是如此。

【讨论】:

  • 还应该提到,既然有这种双缓冲系统,如果你调用 scanf("%d", &some_int);scanf("%c", &some_char);并且您的输入是“123h”,用户只会被提示输入一次,因为缓冲区从未完全清除
  • @Greg:嗯,用户从来没有真正从这段代码中得到“提示”。更好的考虑方法是程序只阻塞等待输入 ONCE,因为当第二个 scanf 命中时,数据已经存在。
  • 如果 stdin 没有缓冲,则没有第二个缓冲区(或者更确切地说,它只有一个字节长来支持 ungetc)。 scanf 不必在用户键入时准确运行,因为它只是执行 read() 或等效操作以从底层获取数据。甚至不需要为底层提供缓冲区......例如,如果从终端执行原始模式 I/O。
猜你喜欢
  • 2021-11-08
  • 2015-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-15
相关资源
最近更新 更多