scanf函数详解

scanf函数详解C库包含多个输入输出函数,scanf是其中一个比较常用的,因为scanf可以读取不同格式的数据。输入函数除了scanf之外还有fgets、getcahr。printf()函数与scanf()函数是C语言中较为常用的输入输出函数,因为这两个函数的参数是不确定的,编译器也没有办法进行检查,因此用的时候挺容易报错,下面就总结一下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接收到了一个参数

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/35842.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注