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后有一个空格),我们真正需要输入的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.输入输出值都用下划线标出是为了体现空格的存在。

  • 31
    点赞
  • 105
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值