我尝试理解scanf和输入缓冲区之间的关系。我使用以下格式字符串来使用scanf:
int z1,z2;
scanf("%d %d", &z1,&z2);
请尝试理解一下为什么我可以在输入数字54后输入尽可能多的空格(回车,空格,制表符)。
据我所知,我按下的每个键都会放在输入缓冲区中,直到我按下Enter键。
因此,如果我输入54并按Enter键,输入缓冲区包含3个元素,即两个数字和换行符。因此我的缓冲区看起来像 [5][4][\n]。
现在scanf/formatstring是从左向右进行评估的。所以第一个%d匹配54,54存储在z1中。
由于格式字符串中有空格,因此由按下第一个Enter键引起的换行符(\n)被"消耗"了。
因此,在第一个%d和空格(\n)的评估之后,缓冲区再次为空。
现在scanf尝试评估格式字符串中的第二个(也是最后一个)%d。 因为缓冲区现在是空的,scanf等待进一步的用户输入(用户输入=在我的情况下从stdin读取,即键盘)。
因此,缓冲区状态/动作序列如下:
缓冲区为空 - > 调用scanf - > scanf阻塞用户输入 -> 用户输入为: 54 Enter - > 缓冲区包含: [5][4][\n] - > 评估第一个%d - > 缓冲区包含[\n] - > 评估空格 - > 缓冲区为空 - > scanf阻塞用户输入(因为评估第二个也是最后一个%d) - > ...。
我理解得对吗?(对不起,英语不是我的母语)
问候。
prog < prepared-inp.txt
,在Windows命令 shell 和各种Linux shell 中的工作方式相似。 - Peter - Reinstate Monica%d
格式正确地跳过它遇到的所有空格字符,因为它只对数字感兴趣。格式字符串中的空格字符仅对%c
和%[...]
有意义(否则将其分配给相应的参数)。 - Peter - Reinstate Monicasetbuf()
更改),但你也可以禁用它!有趣的是*getchar()
看到的字符序列*。它们确切来自哪里以及它们是否被缓冲在某个地方是次要的。 - Peter - Reinstate Monica%n
之前是否存在空白字符?没错。当然了;-)。 - Peter - Reinstate Monica