当需要输入整形数据时,会发现如果%d 后面加了空格,按下回车键时控制台并没有反应,这其实就是吃空白行为。
文章目录
- 前言
- %d后面加空格的吃空白行为
- 吃空白的其他用法
前言
给变量赋值实际上是从缓冲区中提取符合的数据到变量中,而缓冲区中的数据需要我们从键盘中输入。
比如我们给两个整形变量赋值:
#include<stdio.h>
int main()
{
int a, b;scanf("%d%d", &a,&b);printf("a=%d", a);printf("b=%d", b);//scanf("%d", &a);//printf("a=%d", a);//scanf("%d",&b);//printf("b=%d", b);//这种方式和上面的scanf("%d%d", &a,&b);给a和b一起赋值没有区别return 0;
}
对于上面的情况,可以有两种赋值方式,第一种是输入a的值,再输入b的值然后回车:
第二种是输入a的值,回车,再输入b的值:
相比于第一种,你会发现第二种在输入b之前多了一个回车,但是很明显这个回车并没有输入到b中,那是因为%d在匹配时,会丢弃开始匹配的数字字符前的所有空格和回车,直到出现数字字符,然后scanf开始解析数字字符串,再将对应的数值最终存入变量b中。等%d的匹配工作做完后,scanf的工作就结束了,因为%d后没有要匹配的了。因此此时缓冲区只剩下一个换行符(我们最后按的回车键)。
也就是说%d这种输入方式天生就会把缓冲区中数字字符串之前的空格和回车全部丢弃掉,也就是吃空白的行为。
%d后面加空格的吃空白行为
如果%d后面加上空格,在%d的匹配工作结束后,%d后面的空格开始工作,空格表示“吃掉”所有空白字符,也就是说会丢弃缓冲区中的所有空格和换行符,因此无论我们输入多少次回车都不会有反应。
这时候只需要输入一个非空白字符就能使空格吃空白的工作停下来,因为非空白字符出现时,意味着空格的工作就结束了。
但是这样做会造成一个问题,那就是第二个非空白字符会留在缓冲区中,下次输入时就会被读取,比如下面的情况:
因此不建议在%d的后面加入空格。
吃空白的其他用法
在%d后面加空格会出现吃空白的情况,在前面加也会出现这种情况,但是由于%d本身就会吃掉整形数据前面的空白,因此在%d前面加空格没有意义。
但是%c就不同,空格也属于字符型的一种,因此在读取字符型数据时要格外注意缓冲区中的数据。
比如下面的情况:
#include<stdio.h>
int main()
{
int a;char b;scanf("%d", &a);scanf("%c", &b);printf("a=%d", a);printf("b=%c", b);return 0;
}
b会把10后面的空格读取并保存:
b会把回车读取并保存:
正确的输入方式:
如果在%c前面加上空格,就可以丢弃缓冲区中的空白字符,直到碰到非空白字符:
#include<stdio.h>
int main()
{
int a;char b;scanf("%d", &a);scanf(" %c", &b);printf("a=%d", a);printf("b=%c", b);return 0;
}
因此在输入非空格和回车的字符数据时(比如a,b,c,+,- 等字符),建议在%c前面加上空格,防止读取到空格和回车等字符。