关于scanf()函数

来源:互联网 发布:sql server tinyint 编辑:程序博客网 时间:2024/05/09 12:15
scanf()函数是通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。可以读入任何固有类型的数据并自动把数值变换成适当的机内格式。
其调用格式为: scanf("<格式化字符串>",<地址表>);
scanf()函数返回成功赋值的数据项数,出错时则返回EOF。

其控制串由三类字符构成:
1。格式化说明符; 
2。空白符; 
3。非空白符;

1、格式化说明符(省略了我们不常用的)

格式字符           说明 
%c                 读入一个字符        //注意,这里的"一个" 
%d                 读入十进制整数
%i                 读入十进制,八进制,十六进制整数 
%o                 读入八进制整数 
%x                 读入十六进制整数 
%X                 同上 
%s                 读入一个字符串    //字符串是由双引号括起来的0到若干个字符,如:"abc"
%f                 读入一个浮点数 
%F                 同上 
%e                 同上 
%E                 同上 
%g                 同上 
%G                 同上  
%u                 读入一个无符号十进制整数 


附加格式说明字符表
修饰符                       说明
L/l 长度修饰符               输入"长"数据 
h 长度修饰符                 输入"短"数据 
W 整型常数                   指定输入数据所占宽度 
* 星号                       空读一个数据 //读入一个数据,但不赋值给相应的变量


2、空白字符
空白字符会使scanf()函数在读操作中略去输入中的一个或多个空白字符,空白符可以是space,tab,newline等等,直到第一个非空白符出现为止。scanf会在输入流中读空白字符,但是不保存结果。在输入流中数据(数值)必须由空白字符进行分割,注意逗号和分号不是分割字符。


3、非空白字符
一个非空白字符会使scanf()函数在读入时剔除掉与这个非空白字符相同的字符(匹配),如未发现匹配则scanf()返回。


4、使用方式举例
4.1.
#include "stdio.h" 
void main() 

int a,b,c; 
scanf("%d%d%d",&a,&b,&c); 
printf("%d,%d,%d\n",a,b,c);
}  
运行时按如下方式输入三个值(□代表空格):
3□4□5 ↙(输入a,b,c的值)
3,4,5 (printf输出的a,b,c的值)


(1) &a、&b、&c中的&是地址运算符,分别获得这三个变量的内存地址。 
(2)"%d%d%d"是按十进值格式输入三个数值。输入时,在两个数据之间可以用一个或多个空格、tab键、回车键分隔。 
以下是合法输入方式: 
① 3□□4□□□□5↙ 
② 3↙ 
   4□5↙ 
③ 3(tab键)4↙ 
   5↙


4.2
#include "stdio.h" 
void main() 

int a,b,c;
scanf("%d,%d,%d",&a,&b,&c); 
printf("%d,%d,%d\n",a,b,c);
}  
运行时按如下方式输入三个值:
3,4,5 ↙(输入a,b,c的值)
或者
3,□4,□5 ↙(输入a,b,c的值)
3,□□□4,□5 ↙(输入a,b,c的值) 
...... 
都是合法的,但是","一定要跟在数字后面,如: 
3□,4,□5 ↙就非法了,程序出错。


4.3 scanf()的格式控制串可以使用其它非空白字符,但在输入时必须输入这些字符。
例: 
scanf("%d,%d",&a,&b); 
输入: 3,4 ↙(逗号与"%d,%d"中的逗号对应) 
scanf("a=%d,b=%d",&a,&b); 
输入: a=3,b=4 ↙("a=","b=",逗号与"%d,%d"中的"a=","b="及逗号对应)


4.4 在用"%c"输入时,空格和“转义字符”均作为有效字符。
例: 
scanf("%c%c%c",&c1,&c2,&c3); 
输入:a□b□c↙ 
结果:a→c1,□→c2,b→c3 (其余被丢弃)


4.5 scanf()函数接收输入数据时,遇以下情况结束一个数据的输入:(不是结束该scanf函数,scanf函数仅在每一个数据域均有数据,并按回车后结束)。 
① 遇空格、“回车”、“跳格”键。 
② 遇宽度结束。 
③ 遇非法输入。


4.6 空白符问题 
#include <stdio.h> 
main() { 
int a; 
printf( "input the data/n "); 
scanf( "%d\n",&a);//这里多了一个回车符\n 
printf( "%d",a); 
return 0; 

结果要输入两个数程序才结束,而不是预期的一个,why? 
原因:用空白符结尾时,scanf会跳过空白符去读下一个字符,所以你必须再输入一个数。这里的空白符包括 


空格,制表符,换行符,回车符和换页符。所以如果你用scanf("%d ",&a)也会出现同样的问题。 
解决方法:这种错误大多是输入的时候不小心,编译不会提示有问题,所以打代码的时候要注意不能随便加空格、'\n'等等 


4.7 scanf()函数的参数输入类型不匹配问题  
#include <stdio.h> 
main() 

int a,b;
float x,y;
char c1,c2;
scanf("a=%db=%d",&a,&b);
scanf("%f%f",&x,&y);
scanf("%c%c",&c1,&c2);
printf("a=%d,b=%d,x=%f,y=%f,c1=%c,c2=%c\n",a,b,x,y,c1,c2);

当输入3 7 8.5 71.82Aa回车后直接输出为 
a=-858993460,b=-858993460,x=3.000000,y=7.000000,c1= ,c2=8
原因:对于scanf( "%d%d ",&a,&b),scanf语句执行时,首先试图从缓冲区中读入一个%d类型的数据,如果和如果和 


第一个参数匹配,则继续从缓冲区中读取数据和第二个参数进行匹配,依次进行下去,直到匹配完所有的参 


数;如果其中有一个参数不匹配,那就从这个地方跳出,忽略这个scanf后面所有的参数,而去执行下一条语句,也就是说因为没有匹配的"a=",所以第一个scanf就不执行了,直接执行第二个scanf("%f%f",&x,&y); 例如:
#include <stdio.h> 
int main() 

int a,b; 
char c; 
scanf("%d%d",&a,&b); //这里要读入俩个整数
scanf("%c",&c); 
printf("%d\n%d\n%c\n",a,b,c); 
return 0; 
}
输入:2 回车A 回车 
第一个参数匹配,所以2读入到a里了,第二个参数是回车,不匹配了,所以不再执行第一个scanf而是直接执行第二个,把字符'A'读入到c,运行的结果是:
2     //读入的值
-858993460 //随机值
A //读入的值