scanf函数详解

C库包含多个输入输出函数,scanf是其中一个比较常用的,因为scanf可以读取不同格式的数据。输入函数除了scanf之外还有fgets、getcahr。

printf()函数与scanf()函数是C语言中较为常用的输入输出函数,因为这两个函数的参数是不确定的,编译器也没有办法进行检查,因此用的时候挺容易报错,下面就总结一下scanf()函数的用法

参数(输入):

scanf()函数的参数分为两部分,一部分为转换字符,另一部分为待传入变量的地址,除数组外其他的都需要加地址符&。举例:

#include<stdio.h>
int main(void)
{	
	int n;
	char arr[40];

	scanf("%d%s",&n,arr);
	return 0;
}

注意:

因为字符串是char类型的数组,所以不用加取地址符。

不用加取地址符的原因是数组名就是数组中第一个元素的地址,而其他的变量名并没有这种作用,所以需要加取地址符。

scanf的转换字符

scanf的转换字符与printf函数的转换字符相同,只不过printf把数据转换成相应格式输出,而scanf把输入的数据转换成相应的格式

详细的转换字符表见printf()转换字符总结

scanf的*修饰符

scanf中的*修饰符和printf中的*修饰符不同,scanf中的*修饰符用在%和转换字符之间用于跳过该输入项,举个栗子:

scanf("%*d%*d%d",&n);

假如输入为1 2 3,则n的值为3,直接跳过了前两个输入。

scanf读取的过程

假设使用%d读取一个整数,scanf会从第一个非空字符开始读取(遇到空格会跳过),因为接收的类型为%d,所以scanf会读取数字,当读取的数符合要求时便会继续读取下一个字符,直至遇到非该类型字符,便结束本次读取,并将读取的数据传给变量。程序在下一次读取的时候会从上次结束位置的非数字字符开始读取,当遇到无法识别非数字字符时,scanf便停止读取并将下一个变量赋值为0;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GRDM1O9i-1661514046784)(C:/Users/24443/AppData/Roaming/Typora/typora-user-images/image-20220826182443761.png)]

举个栗子:

#include<stdio.h>
int main(void)
{
    int a,b;
    scanf("%d%d",&a,&b);
    printf("a=%d,b=%d",a,b);
    
    return 0;
}
// 跳过空字符后开始读取,遇到非数值型后结束第一个字符的读取存入a,第%d从字符n开始读取,但是读取不了,所以b=0
输入:
  1n1
输出:
a=1,b=0 
 
// 遇到1后开始读取,遇到空格结束读取存入a,第二个%d从空格开始读取,跳过空格后读取2存入b
输入:
1 2
输出
a=1,b=2 

使用字段宽度,scanf会在字符结束或者遇到第一个空白字符结束读取(满足其中一个条件即可)

举个栗子:

#include<stdio.h>
int main(void)
{
    int a,b;
    scanf("%2d%d",&a,&b);
    printf("a=%d,b=%d",a,b);
    
    return 0;
}
输入
123 4

输出
a=12,b=3

思考一下,如果按照scanf函数的规则如果程序是下面这样,输出会是什么?

#include<stdio.h>
int main(void)
{
    int a,b,c;
    scanf("%2d%d%d",&a,&b,&c);
    printf("a=%d,b=%d,c=%d",a,b,c);
    
    return 0;
}
输入123 4


答案
输出a=12,b=3,c=4
格式字符串中的普通字符串

scanf函数允许将普通字符添加在格式字符串中,比如在转换说明中添加一个逗号

scanf("%d,%d",&a,&b);

scanf函数的解释为:用户输入一个整数型再输入一个逗号再输入一个整数型。

所以输入可以这样写:

1,2
或
1,
2

但是不可以这样写:

1 , 2

而程序修改成

scanf("%d ,%d",&a,&b);

则可以接收如上输入,原因是格式字符串中的空白意味着跳过下一个输入项之前的所有空白字符

除了%c,其他转换说明都会自动跳过前面的空白字符,如果把空格放到%c前,scanf在读取的时候会自动跳过前面的空格字符,从第一个非空字符开始读取

scanf("%c",&c);//从第一个字符开始读取
scanf(" %c",&c);//从第一个非空字符开始读取
返回值(输出):

scanf函数返回成功读取的项数

举个栗子:

#include<stdio.h>
int main(void)
{
	int num,rv;
	rv=scanf("%d",&num);
	printf("rv=%d\n",rv)
	return 0;
}
输入一个int类型的数
输出1,表示scanf接收到了一个参数

写了这么多,但是理解的还不是特别透彻,但也有收获,等以后再慢慢补充。

  • 10
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

指针到处飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值