例如,当我执行 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/