您的位置: 网站首页 > 程序开发 > C语言程序设计 > 第3章 顺序结构程序设计 > 【3.4 格式化输入函数scanf()】

3.4 格式化输入函数scanf()

 

3.4  格式化输入函数scanf()

scanf()函数的功能是从计算机默认的输入设备(一般指键盘)向计算机主机输入数据。

3.4.1  scanf()函数的一般格式

调用scanf()函数的一般格式如下:

scanf("格式字符串",输入项地址表);

例如:

scanf("%d%f",&i,&f);

其中,“格式字符串”可以包含三种类型的字符:格式指示符、空白字符(空格、跳格键、回车键)和非空白字符(又称为普通字符)。格式指示符用来指定数据的输入格式;空白字符作为相邻两个输入数据的默认分隔符;非空白字符在输入有效数据时必须按原样一起输入。

“输入项地址表”由若干个输入项地址组成,相邻两个输入项地址之间用逗号分开。输入项地址表中的地址可以是变量的地址,也可以是字符数组名或指针变量(在后续章节中介绍)。变量地址的表示方法为“&变量名”,其中“&”是地址运算符。

C++中,cin表示标准输入流对象,用于从键盘获取数据,“>>”是提取符,它将用户从键盘输入的数据赋给其后的变量,而且不像scanf()函数那样需要指定格式指示符,即“cin >>”语句可以为任何类型的变量获取数据,使用起来简单方便。例如,与上述语句等同功能的cin语句如下:

cin >> i >> f;

不过,由于定义提取符等包含在头文件iostream.h中,所以在使用“cin >>”语句时应包含“#include <iostream.h>”预处理命令。

3.4.2  格式指示符

格式指示符的一般形式如下:

%[修饰符]格式字符

scanf()函数常用格式字符如表3-3所示。

3-3  scanf()函数常用格式字符

格式字符

   

c

输入单个字符

di

输入有符号的十进制整数

o

输入无符号的八进制整数

xX

输入无符号的十六进制整数

u

输入无符号的十进制整数

f

输入实数,可以用小数形式或指数形式输入

eEgG

f的作用相同,efg可以互相替换

s

输入字符串,将字符串送到一个字符数组中,在输入时以非空白字符开始,以第1个空白字符结束,字符串以串结束标志'\0'作为其最后一个字符

1.宽度修饰

宽度修饰用来指定输入数据所占列数,例如:

scanf("%3c%3c",&ch1,&ch2);

假设输入“abcdefg”,则系统将读取的“abc”中的“a”赋给变量ch1,将读取的“def”中的“d”赋给变量ch2

2.抑制修饰符

抑制修饰符“*”表示对应的数据读入后,不赋给相应的变量,该变量由下一个格式指示符输入。例如:

scanf(%2d%*2d%3d",&n1,&n2);

假设输入“123456789”,则系统将读取“12”并赋值给n1;读取“34”,但舍弃掉(“*”的作用);读取“567”并赋值给n2

【程序3-4当输入“11 22 33 44 55 66 77 88 99↙”时,以下程序的运行结果是什么?

/*文件名:chap03_4.cpp*/

#include <stdio.h>

void main()

{

    int n1,n2,n3,n4,n5;

    scanf("%d%*d%d%*d%d%*d%d%*d%d",&n1,&n2,&n3,&n4,&n5);

    printf("s1=%d,s2=%d\n",n1+n3+n5,n2+n3+n4);

}

程序运行结果:

s1=165,s2=165

程序中虽然要求输入9个整数,但对于所输入的第2468个整数抑制了赋值,n1n2n3n4n5得到的值分别是1133557799n1+n3+n5=165n2+n3+n4=165

3.长度修饰符

在输入长整型数据和双精度实型数据时,必须使用长度修饰符“l”,否则不能得到正确的输入值。例如:

long x;double y;

scanf("%ld %lf",&x,&y);

3.4.3  使用说明

调用scanf()函数输入数据时,要注意以下几点。

1)如果相邻两个格式指示符之间不指定数据分隔符(如逗号、冒号等),则相应的两个输入数据之间至少用一个空格分开,或者用Tab键分开,或者输入一个数据后,按Enter键,然后再输入下一个数据。例如:

scanf("%d%d",&n1,&n2);

假设给n1输入10,给n2输入20,则正确的输入操作为:

10 20

或者:

10

20

2scanf()函数中没有精度控制,如scanf("%5.2f",&x);是错误的。不能企图用此语句输入小数为2位的实数。

3格式字符串中出现的普通字符(包括转义字符形式的字符)务必按原样输入。例如:

scanf("n1=%d,n2=%d",&n1,&n2);

假设给n1输入10,给n2输入20,正确的输入操作为:

n1=10,n2=20

另外,对于scanf()函数中格式字符串内的转义字符(如'\n'),系统并不把它当转义字符来解释,从而产生一个控制操作,而是将其视为普通字符,也要按原样输入。例如:

scanf("n1=%d,n2=%d\n",&n1,&n2);

假设给n1输入10,给n2输入20,正确的输入操作为:

n1=10,n2=20\n

为了改善人机交互性,同时简化输入操作,在设计输入操作时一般先用printf()函数输出一个提示信息,再用scanf()函数进行数据输入。例如:

printf("n1=");scanf("%d",&n1);

printf("n2=");scanf("%d",&n2);

4)输入数据时,若遇到以下情况系统则认为该数据输入结束。

遇到空格或者回车键或者Tab键。

遇到输入域宽度结束。例如“%3d”,只取三列。

遇到非法输入。例如,在输入数值数据时,遇到字母等非数值符号(数值符号仅由数字字符09、小数点和正负号构成)。

5)使用格式说明符“%c”输入单个字符时,空格和回车键符号等均作为有效字符被输入。例如:

scanf("%c%c%c",&ch1,&ch2,&ch3);

printf("ch1=%c,ch2=%c,ch3=%c\n");

假设输入A B↙,则系统将字母“A”赋值给ch1,空格赋值给ch2,“B”赋值给ch3

【程序3-5有以下程序:

/*文件名:chap03_5.cpp*/

#include <stdio.h>

void main()

{

    int i;

    float f;

    char c;

    scanf("%d%c%f",&i,&c,&f);

    printf("i=%d,c=%c,f=%f\n",i,c,f);

}

当输入100a1.234↙时,程序将100赋给整型变量i'a'赋给字符型变量c1.234赋给单精度型变量f,所以输出结果是:

i=100,c=a,f=1.234000

当输入1.23456↙时,程序将1赋给整型变量i,“.”赋给字符型变量c23456赋给单精度型变量f,输出结果是:

i=1,c=.,f=23456.000000

【程序3-6编写一个程序,输入弧度值,将弧度值换算成角度值(度、分、秒的形式)输出。

x为弧度,则对应的角度为(180*x)/π,其整数部分为度,余下的小数部分乘以60取整数部分得到分,再将余下的小数部分乘以60取整数部分得到秒。程序如下:

/*文件名:chap03_6.cpp*/

#include <stdio.h>

#define PI 3.14159

void main()

{

    float x,a,a1;

    int d,f,m;                  /*d为度,f为分,m为秒*/

    printf("输入弧度:");

    scanf("%f",&x);

    a=x*(180.0/PI);

    d=(int)a;                   /*取弧度*/

    a1=(a-d)*60;

    f=(int)a1;                  /*取分数*/

    m=int((a1-f)*60+0.5);       /*取秒数,0.5用于进行四舍五入计算*/

    printf("%g <==> %d%d%d\n",x,d,f,m);

}

本程序的一次运行结果如下:

输入弧度:2.4

2.4  <==> 1373036