当前位置: 首页 > 知识库问答 >
问题:

c语言中的scanf与关系输入缓冲区

笪俊迈
2023-03-14

我试图理解scanf和输入缓冲区之间的关系。我将scanf与以下格式字符串一起使用:

int z1,z2;
scanf("%d %d", &z1,&z2);

并尝试理解为什么我可以输入尽可能多的空白(输入,空白,选项卡)后,我输入一个数字,如54,并按回车键。

据我所知,我按下的每一个键都会被放入输入缓冲区,直到我按下回车键。

因此,如果我输入54并按Enter键,输入缓冲区包含3个元素,两个数字和换行符。所以我的缓冲区看起来像[5][4][\n]

现在从左到右计算scanf/formatstring。所以第一个%d匹配到54,54被存储在z1中。

由于格式字符串中有空格,按第一个enter键导致的换行符(\n)被“消耗”。

因此,在计算第一个%d和空格(\n)后,缓冲区再次为空。

现在scanf尝试计算格式字符串中的第二个(也是最后一个)%d。因为缓冲区现在是空的,scanf等待进一步的用户输入(用户输入=在我的案例键盘中从标准输入读取)。

因此,缓冲区状态/操作序列是

缓冲区空-

我理解得对吗?(对不起,英语不是我的母语)

问候

共有2个答案

艾焕
2023-03-14

差不多。

Scanf读取输入缓冲区(stdin)。

在窗口cmd.exe终端按下回车键会将您输入的输入刷新到输入缓冲区中,提示您的第一个变量已填充。

然后,它再次提示填充第二个变量。

云何平
2023-03-14

据我所知,我按下的每一个键都会被放入输入缓冲区,直到我按下回车键。

对的按Enter键将数据刷新到标准输入流中。请注意,它还将\n发送到stdin中。

因此,如果我输入54并按Enter键,输入缓冲区包含3个元素,两个数字和换行符。所以我的缓冲区看起来像[5][4][\n]

现在从左到右计算scanf/formatstring。所以第一个%d匹配到54,54被存储在z1中。

正当

由于格式字符串中有空格,按第一个enter键导致的换行符(\n)被“消耗”。

正确。

因此,在计算第一个%d和空格(\n)后,缓冲区再次为空。

现在scanf试图计算格式字符串中的第二个(也是最后一个)%d

不完全是。

两个%d之间的空格是空白字符,scanf格式字符串中的空白字符指示scanf扫描并丢弃所有空白字符(如果有),直到第一个非空白字符。这可以在C11标准的委员会草案n1570中看到:

7.21.6.2 fscanf功能

[...]

这意味着执行仍然在%ds之间的空格中,因为它还没有遇到非空白字符。

因为缓冲区现在是空的,所以scanf等待进一步的用户输入(用户输入=在我的键盘中从标准输入读取)。

所以

缓冲区空-

应该是

“缓冲区为空-

请注意,当%d之间(在%d之前)有许多空白字符或没有空白字符时,scanf的行为方式相同,因为%d已经跳过了前导空白字符。事实上,只有%c%[%n的格式说明符是重要的,如n1570所示:

7.21.6.2 fscanf功能

[...]

 类似资料:
  • 输入就是将程序外部的数据输入到程序内部,输出就是将程序内部运行的结果等内容从程序内部输出到显示器,打印机或者存放到文件中。 编程语言中的输入输出担负着程序与用户的交互工作。 1. 标准输入输出 C 语言中的标准输入输出包含 3 部分。标准输入,标准输出,标准错误输出。 表中列举了标准输入输出和与之关联的物理设备。 输入输出 设备 标准输入 键盘 标准输出 显示器屏幕 标准错误输出 显示器屏幕 标准

  • 本文向大家介绍C语言中scanf()和gets()之间的区别,包括了C语言中scanf()和gets()之间的区别的使用技巧和注意事项,需要的朋友参考一下 在C语言中,都定义了和函数,以从外部源获取输入并将其作为输入传递给系统。现在,两个功能之间存在一些特性差异。 以下是和之间的重要区别- 序号 键 scanf()函数 gets()函数 1 定义 该方法可以从键盘读取输入,并根据给定的格式说明符将

  • 问题内容: 我碰到一行,命令的输出已完全缓冲。这是什么意思? 问题答案: 在线C11标准 7.21.3 / 3: 当流没有 缓冲时 ,字符应尽快从源或目标出现。否则,字符可能会作为块被累积并传输到主机环境或从主机环境传输。当流被 完全缓冲时 ,打算在填充缓冲区时将字符作为块与主机环境进行传输。当流被 行缓冲时 ,当遇到换行符时,字符打算作为块与主机环境进行传输。此外,当填充缓冲区,在无缓冲流上请求

  • 本文向大家介绍C语言使用scanf连续输入字符串出现的问题,包括了C语言使用scanf连续输入字符串出现的问题的使用技巧和注意事项,需要的朋友参考一下 一段看上去很简单的代码,即使是C语言初学者也能看懂。 可是在运行的时候却出现了问题: ①输入a后按下回车 ②用空格隔开之后再按下回车 相信和我一样的大部分初学者,看着自己天衣无缝的代码,百思不得其解。 让我们先来看看,在百度百科中,对于scanf函

  • 问题内容: 今天,我了解到,将stdout设置为terminal并在不同情况下进行缓冲时,它是行缓冲的。因此,在正常情况下,如果我使用printf()而不以“ \ n”结尾,则仅在缓冲区已满时才在屏幕上打印它。如何获得此缓冲区的大小,这有多大? 问题答案: 实际大小由各个实现定义;该标准并没有规定最小大小(无论如何,基于我已经能够找到的大小)。没有关于如何确定缓冲区大小的线索。 编辑 章节: 7.

  • 主要内容:再谈 if 语句的判断条件在上节《 C语言if else语句》中看到,if 的判断条件中使用了 、 、 等符号,它们专门用在判断条件中,让程序决定下一步的操作,称为 关系运算符(Relational Operators)。 关系运算符在使用时,它的的两边都会有一个表达式,比如变量、数值、加减乘除运算等,关系运算符的作用就是判明这两个表达式的大小关系。注意,是判明大小关系,不是其他关系。 C语言提供了以下关系运算符: 关系运