
scanf中的一些格式问题(一)——scanf内含空格
现象
1.两个整型数据之间出现空格:(严格上说是占位符,下同)
我们使用scanf函数时会发现有些情况下在%d和%d之间加空格,如:
scanf("%d %d",&a,&b);
printf("%d%d",a,b);
有时又不加空格,如:
scanf("%d%d",&a,&b);
printf("%d%d",a,b);
对于这两个代码——
输入:12 (1和2之间无空格) 均输出为12
输入:1 2(注意,1和2中间有空格,有任意个空格都行) 均输出为12
输出结果没有随输入方式的改变而变化。
然而有些情况却出现了区别,比如——
2.整型数据和字符型数据间出现空格:
我们来看一组代码:
(代码一)
#include<stdio.h>
#include<string.h>
int main()
{
int a;
char b;
scanf("%d%c",&a,&b);
printf("%d%c",a,b);
return 0;
}
a是整型变量,b是字符型变量,当我们输入:1a 时(注意,1和a中间无空格),输出为1a(如图所示)
但是输入1 a时(注意中间只有一个空格),输出却看起来变成了1(如图所示)
那么如果我在(代码一)的%d和%c之间加一个空格——
变成这样——
(代码二)
#include<stdio.h>
#include<string.h>
int main()
{
int a;
char b;
scanf("%d %c",&a,&b);
printf("%d%c",a,b);
return 0;
}
此时,输入1a得到的输出结果还是:(因为scanf() 处理数值占位符时,会⾃动过滤空⽩字符)
但是,输入1 a后(注意中间有空格),输出变成了1a(如图所示)
这样就达到了输出目的。
———————————————————————————————————————————
原理解释
这是为什么呢?
首先,整型数据类型对应的 %d只接收整型数据 ,因此在终端(缓冲区)输入空格时scanf函数会将其自行忽略。
对于 scanf("%d%c",&a,&b); (特别强调——是%d%c之间无空格的情况下!)
当scanf中出现字符型对应的%c时,由于空格也是一种字符,所以scanf不会忽略输入的空格,相应的%c会将1后面输入的空格当作b的值,故而实际上输出的结果为1 (1后有一个空格),我们真正需要输入的a并没有被读入scanf函数。
我们可以用以下代码进行验证:
在b后增加一个整型数据c,我们输入1 2
(代码三)
#include<stdio.h>
#include<string.h>
int main()
{
int a;
char b;
int c;
scanf("%d%c%d",&a,&b,&c);
printf("%d%c%d",a,b,c);
return 0;
}
则输出结果为:
这说明我们输入的空格最终也输出了。
———————————————————————————————————————————
而对于 scanf("%d %c",&a,&b); (特别强调——是%d%c之间有空格的情况下!)
scanf引号里的空格,可以理解为吞掉所有空白字符(空格 换行 tab),这就是空白符较为特殊的一点——虽然空格(或换行\n或tab)属于字符,但会被scanf里的空格吞掉。
验证方法很简单,我们继续用(代码二)——
#include<stdio.h>
#include<string.h>
int main()
{
int a;
char b;
scanf("%d %c",&a,&b);
printf("%d%c",a,b);
return 0;
}
此时我们输入1 a,可以看到,1与a之间有很多空格,那么输出情况是:
这就证明了所有空格都被scanf里的空格吞掉了。
我们不妨再多尝试一下——
我在缓冲区依次输入了换行、tab、空格,最后输入a,最终输出结果还是1a
这就证明了空格换行tab都被scanf里的空格吞掉了。
应用
如果我们想要输入1 a(中间一个空格)得到1a,也就是达到将a赋给b的目的,这里提供两个解决方案——
方案一
使用(代码一)思路,在%d和%c之间加空格
方案二
类似(代码三)思路,增加一个字符型变量c
#include<stdio.h>
#include<string.h>
int main()
{
int a;
char b,c;
scanf("%d%c%c",&a,&b,&c);
printf("%d%c%c",a,b,c);
return 0;
}
则输入1 a,输出为1 a。
总结
理解scanf()函数一定要结合缓冲区的输入,scanf函数中应谨慎使用空白符,同时注意不同数据类型对应的占位符的作用。
此外,本文仅仅介绍了scanf函数的一部分作用,并未涉及字符串等内容,如果觉得不够用的话务必继续深入挖掘噢~
P.S.输入输出值都用下划线标出是为了体现空格的存在。
更多推荐



所有评论(0)