C语言 scanf

初步介绍

scanf的第一个参数是一个格式字符串,里面会放置占位符,(和printf()的占位符基本一致),告诉编译器如何解决用户的输入,需要提取的数据是什么类型的。

这是C语言的数据都是有类型的,scanf() 必须提前知道用户输入的数据类型,才能够处理数据。

scanf("%d",&i);

不论是scanf还是printf,都对类型很重要

有多少个占位符就有多少个变量——printf和scanf同理!

#include <stdio.h>

scanf的原型定义在头文件,stdio.h

格式

scanf 是具有格式的问题。

1、占位符与占位符之间的间隔

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

列如,占位符与占位符之间是空格符号,那么再输入数据的过程中,数据与数据之间也必须使用空格来进行分隔数据,否则会出错。

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

 如图,再输入的过程中,必须要再数据和数据之间加入  -  横杠的分隔符号。

2、忽略符号

因为格式的原因,scanf的占位符和占位符之间有格式,所以输入数据的时候要按照scanf的占位符之间的格式输入,不然会出错。

但是有一种符号格式可以直接被scanf忽略 。

%*c

scanf("%d%*c%d%*c%d%*c",&a,&b,&c);
printf("%d %d %d\n",a,b,c);

 

 有了%*c之后,在输入数据的时候可以用任何的格式。

3、不允许输入的\n符号

scanf("%d%d%%f%f",&a,&b,&c,&d);
printf("%d %d %f %f\n",a,b,c,d);

scanf 不允许再括号内加入\n(换行符),但是scanf()再处理数值占位符的时候,会自动过滤空白字符,包括空格、制表符、换行符等。

换一种说话,scanf()可以支持手动换行输入数据

 解读输入

scanf () 处理用户输入的原理是,用户的输入先放入缓存,等到按下回车键后,按照占位符对缓存进行解读。

解读用户输入时,会冲上一次解读一六的第一个字符开始,直到读完缓存,或者是遇到第一个不符合占位符要求的字符为止。

列如:

#include <stdio.h>
int main()
{
 int x;
 float y;
 //用户输入 "-13.45e12# 0"
 scanf("%d",&x);
 scanf("%f",&y);
 printf("%d\n",x);
 printf("%f\n",y);
 return 0;
}

总共是输入  -13.45e12# 0  根据输出的占位符来进行划分,%d是指 -13  ,%f是指小数点后面的直到#之前的数值,进过输出加工得出的是 

 因为根据占位符的特点,导致当%d读到小数点的时候自动结束,而%f则是从小数点开始,而后读到#,因为小数没有井号,以及%f的数据类型和#不符,所以停止。

#include <stdio.h>
int main()
{
 int x;
 float y;
 //用户输入 "-13.45e12# 0"
 scanf("%d%f",&x,&y);
 printf("%d\n",x);
 printf("%f\n",y);
 return 0;
}

根据  scanf() 可以连续处理多为占位符,所以也可以写成如上图一样,最后的结果是一致的。

 scanf的返回值

scanf()的返回值是一共整数,表示成功读取的变量个数。

如果没有读取任何项,或者匹配失败,则会返回0,如果再成功读取任何数值之前,发生了读取错误或者遇到了读取文件结尾,则会返回常量 EOF

EOF是文件结束的标识符,且EOF的本质是 -1。

int main()
{
 int a = 0;
 int b = 0;
 float f = 0.0;
 int r =scanf("%d %d %f",&a,&b,&f);
 printf("a = %d\n",a);
 printf("b = %d\n",b);
 printf("f = %f\n",f);
 printf("r = %d\n",r);
 return 0;
}

 

其中,数字3 表示的是,scanf() 的返回值,也同时表示了一共成功读取了三个数据。

 当然,我们可以使用一些特殊的手段,列如再输入第二个数值之后,输入ctrl+z 以此打断输入,由此,scanf() 只能读到两个数值。

当然,ctrl+z 的特殊手段,在某些编译器中要连续输入三次,图中表示的是VS编译器。

 scanf()的多行输入

scanf()可以再一定的要求下进行多行输入。

而 scanf () 多行输入的原理是scanf()的返回值。

要知道,scanf函数再读取数据成功后,会返回输入数据的个数,而scanf函数读取失败后,会返回EOF。

//scanf 的多行输入 

while(scanf("%d",&a)== 1)

while(scanf("%d",&a)!= EOF)

//推荐使用后者!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值