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

在C中的scanf()期间,数据如何从输入流流入输入缓冲区?,c,input,buffer,stdin,scanf,C,Input,Buffer,Stdin,Scanf,例如,当我执行scanf(“%s”,arg)时:终端允许我输入文本,直到遇到换行符,但它最多只存储arg变量中的第一个空格字符。其余部分仍处于缓冲状态 scanf(“%c”,arg):在这种情况下,它还允许我在终端中输入文本,直到我给出一个换行符,但只有一个存储在arg中,其余的保留在缓冲区中 scanf(“%[^p]”,arg);:在这种情况下,我甚至可以在给终端一个换行符之后将文本输入到终端,直到我点击了一个带有“P”的行,然后按enter键(换行符),然后将所有内容传输到输入缓冲区 如何确

例如,当我执行
scanf(“%s”,arg)时:终端允许我输入文本,直到遇到换行符,但它最多只存储arg变量中的第一个空格字符。其余部分仍处于缓冲状态

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

scanf(“%[^p]”,arg)
;:在这种情况下,我甚至可以在给终端一个换行符之后将文本输入到终端,直到我点击了一个带有“P”的行,然后按enter键(换行符),然后将所有内容传输到输入缓冲区

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

假设
arg
的类型正确


我的理解在这里似乎是根本错误的。如果有人能解释一下,我将不胜感激。

缓冲区和原始编辑功能由操作系统提供。 如果您可以将终端设置为“原始模式”,您将看到不同的行为


例如:在按下enter键之前,可以读取字符,特别是当缓冲区也可以被禁用时。

缓冲区和基本编辑功能由操作系统提供。 如果您可以将终端设置为“原始模式”,您将看到不同的行为

在按下enter键之前可以读取字符,特别是当缓冲区也可以被禁用时。

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

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

如果你的意思是“如何在封面下处理它?”,那是另一个问题

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

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

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

它可能(比如GNU
readline()
库允许在发送字符之前对行进行各种非常奇特的编辑。没有什么可以阻止底层软件甚至打开一个
vim
会话来允许您输入数据,并且只在您退出时发送数据:-)

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

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

如果你的意思是“如何在封面下处理它?”,那是另一个问题

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

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

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


它可能(比如GNU
readline()
库允许在发送字符之前对行进行各种非常奇特的编辑。没有什么可以阻止底层软件甚至打开一个
vim
会话来允许您输入数据,并且只在您退出时发送数据:-)

我认为,它与
多少无关,而是与格式说明符所说的内容有关

根据
C99
,第7.19.6.2章第2段,(对于
fscanf()

fscanf函数从受控制的流指向的流中读取输入 指定允许的输入序列和方式的格式所指向的字符串 它们将被转换为赋值,使用后续参数作为指向 对象以接收转换后的输入


至于格式说明符,您需要参考第12段。

我认为,它与
多少有关,而与格式说明符所说的内容无关

根据
C99
,第7.19.6.2章第2段,(对于
fscanf()

fscanf函数从受控制的流指向的流中读取输入 指定允许的输入序列和方式的格式所指向的字符串 它们将被转换为赋值,使用后续参数作为指向 对象以接收转换后的输入


至于格式说明符,您需要参考第12段。

它是否在我按下键盘上的enter键之前就开始读取?那是在我还在向终端输入文本的过程中?在这种情况下,它是如何处理按下的退格键的?谢谢你回答中的扩展。因此,根据格式说明符的不同,编译器(或软件)会在scanf(“[^P]”)的情况下请求更多的行。我假设我的终端和操作系统目前提供onc线路