您的位置:首页 > 其它

关于scanf()函数

2013-03-28 14:47 211 查看
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 //读入的值
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C scanf