初步介绍
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)
//推荐使用后者!