c - C 中的 scanf() 期间数据如何从输入流流入输入缓冲区?

标签 c input buffer stdin scanf

例如,当我执行 scanf("%s",arg); 时:终端允许我输入文本,直到遇到换行符,但它最多只存储第一个空格字符参数变量。其余部分保留在缓冲区中。

scanf("%c", arg); :在这种情况下,它还允许我在终端中输入文本,直到我给出一个换行符,但只有一个存储在 arg 中,而其余部分保留在缓冲区中。

scanf("%[^P]", 参数); : 在这种情况下,即使在给它一个换行符之后,我也可以在终端中输入文本,直到我在其中输入带有“P”的行并按下回车键(换行符),然后将所有内容传输到输入缓冲区。

如何确定一次要从输入流中传输多少数据到输入缓冲区?

假设 arg 是正确的类型。

我的理解似乎从根本上是错误的。如果有人能解释一下这些东西,我将不胜感激。

最佳答案

如何确定?由格式字符串本身决定。

scanf 函数将读取项目,直到它们不再匹配给定的格式说明符。然后它停止,将第一个“不合规”字符留在缓冲区中。

如果你的意思是“它是如何在幕后处理的?”,那是另一个问题。

我对此的第一 react 是“没关系”。 ISO 标准规定了语言的工作方式,并描述了能够做到这一点的“虚拟机”。只要遵守机器的规则,就不必担心幕后发生的事情。

我的第二个答案可能更令人满意,但非常依赖于实现。

为了效率,底层软件可能不会向实现传递任何数据,直到它有一个完整的行(当然这很可能是可配置的,例如为终端设置原始模式).这意味着退格键之类的东西可能更改已经输入的字符,而不是插入到流中。

它可能(例如 GNU readline() 库允许在传送字符之前在行上进行各种非常花哨的编辑。没有什么可以阻止底层软件甚至打开 vim session 允许你输入数据,并且只有在你退出时才传递它:-)

关于c - C 中的 scanf() 期间数据如何从输入流流入输入缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27938290/

相关文章:

c - 为什么在下一个代码中 c = 1?

c - 程序不会打印矩阵

c - 使用程序的输出作为同一程序的输入

python - GNU Radio 输入和输出缓冲区如何工作?

c - 使用 uint8 数组发送大于 255 的整数

c - 为什么 init_pair 在 COLOR_PAIRS 范围的一半时失败?

css - 如何摆脱 mac 上 webkit 中 html5 搜索输入中的水平填充或缩进?

jQuery 输入限制数字/数字为 4,但文本可以是无限长度

c# - VirtualKeyCode.MEDIA_PLAY_PAUSE 不工作

c++比较在缓冲区中的2个字符串之间不起作用