讨论scanf()中%d后面的空格对输入的影响

本篇我们来讨论一下scanf(“%d”,&x)与scanf("%d ",&x)的不同地方

文章目录

  • 前言
  • 一、scanf()提取%d数据的潜规则?
    • 1、%d前的吃空白行为
    • 2、 %d后追加空白字符产生“吃空白”的行为


前言

昨天晚上在做题的时候发现scanf()中%d有吃空白的行为,so小编对“吃空白”行为展开说一说。


一、scanf()提取%d数据的潜规则?

1、%d前的吃空白行为

我们下面看一下例子:

#include 
int  main() {
	int a=0;
	int b=0;
	scanf("%d%d",&a,&b);
	printf("a=%d\n",a);
	printf("b=%d\n",b);
	return 0;
}

像这种%d%d说明符挨着,中间没有任何分隔符,我们输入数据时默认在输入数据时中间可以以任何空白字符作为分隔标志(包括-空格、回车符-\n、水平制表符-\t)并且不限数量。因此在我们输入紧挨着的整形数据时常常使用这种方法,使我们输入更加灵活。

原理:像这种%d%d输入,默认会把缓冲区中数字之前的空格和回车全部丢弃掉

In other words:当我们输入%d这类整形数据时,当我们键入数据后,scanf()在提取整形数据时会自动 “吃掉“%d前所有的空白字符(包括-空格、回车符-\n、水平制表符-\t)直到提取到%d类型的整形数据。例如上述代码,我按照下图输入,依旧可以正常给变量赋值,能正确输出:

小编在输入数字1之前敲了多个tab,输入数字7时敲了回车和多个tab:
讨论scanf()中%d后面的空格对输入的影响_第1张图片

2、 %d后追加空白字符产生“吃空白”的行为

原理:当参数为"%d "的时候,此时没有处理到结尾,scanf()会认为你要继续进行输入。然而你输入了空格或者回车,scanf()认为他们是分隔符,于是“吃空白”吃掉了。换句话来说,scanf()依旧在等待你的输入, 只有当你输入不是空白的字符以后,scanf()才会用它与参数字符串里面的空格比较。
In other words:如果%d后面加上空格,在%d的匹配工作结束后,%d后面的空白字符开始工作,空白字符表示会“吃掉”所有%d之后的空白字符,也就是会丢弃缓冲区中%d后的所有空格、水平制表符和换行符,因此无论我们输入多少次回车都会被%d后的空白字符“吃掉”。如果此时想要停下来,这时候就需要输入一个非空白字符就能使空格吃空白的工作停下来。

这样很容产生bug,就是第二个非空白字符会被留在缓冲区,下次输入的时候会被读取,比如下面这种和情况:
因不建议大家在%d后面追加空白字符,容易产生bug,这些会产生歧义的代码尽量不要出现在自己的project

#include 
int main() {
	int a,b=0;
	while(1!=EOF) {
	scanf("%d ",&a);
	printf("a=%d\n",a);
	}
}

讨论scanf()中%d后面的空格对输入的影响_第2张图片
本文章部分参考了CSDN博主“不摸鱼的程序员”

你可能感兴趣的:(c语言,c语言)