gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:25:14 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com