6.2.4 scanf函数
函数scanf又称为格式输入函数,能够按用户指定的格式从键盘上把数据输入到指定的变量之中。
1.函数scanf的一般形式
函数scanf是一个标准的库函数,其函数原型包含在头文件“stdio.h”中。和函数printf相同,C语言也允许在使用函数scanf之前不必包含stdio.h文件。使用函数scanf的一般格式如下所示。
scanf("格式控制字符串",地址列表);
其中,“格式控制字符串”的作用与函数printf的相同,但是不能显示非格式字符串,即不能显示提示的字符串。地址列表给出各变量的地址。地址是由地址运算符“&”后跟变量名组成的。例如下面的代码分别表示变量a和变量b的地址。
&a, &b
上述地址就是编译系统在内存中给变量a、b分配的地址。在C语言中,地址的概念与其他语言是不同的,应该把变量值和变量地址这两个不同的概念区别开来。变量地址是由C编译系统分配的,用户不必关心具体的地址是多少。
例如在赋值表达式a=123中给变量赋值,则a为变量名,123是变量值,&a是变量a的地址。
在赋值符号左边是变量名,不能写地址。而函数scanf在本质上也是给变量赋值,但它要求写变量的地址,例如&a,这二者在形式上是不同的。单独一个&是一个取地址运算符,而&a是一个表达式,其功能是求变量的地址。
看下面的一段代码。
int main(void){ int a, b, c; printf("input a, b, c\n"); scanf("%d%d%d", &a, &b, &c); printf("a=%d, b=%d, c=%d", a, b, c); }
在上述代码中,因为函数scanf本身不能显示提示字符,所以先用printf语句在屏幕上输出提示用户输入a、b、c的值。当执行scanf语句后,程序会退出Turbo C屏幕进入用户屏幕以等待用户输入。用户输入7 8 9后按下Enter键,此时系统又将返回Turbo C屏幕。在scanf函数的格式串中,因为没有非格式字符在“%d%d%d”之间作输入时的间隔,所以在输入时要用多个空格或Enter键作为两个输入数之间的间隔。
2.格式字符串
函数scanf的格式字符串和函数printf的类似,以%开头,以一个格式字符结束,中间可以插入附加的字符。函数scanf的格式如下所示。
%[*][输入数据宽度][长度]格式字符
其中,方括号“[]”中的部分为可选项。在上述格式中各选项的具体说明如下所示。
❑ 格式字符。
格式字符用于标识输出数据的类型,各格式字符的具体说明如表6-3所示。
❑ “*”字符。
用以表示该输入项,读入后不赋值给相应的变量,即跳过该输入值。例如:
scanf("%d %*d %d", &a, &b);
表6-3 格式字符的说明
当输入1、2、3时,会把1赋值给a,跳过2,3赋值给b。
❑ 宽度。
用十进制整数指定输入的宽度(即字符数)。例如:
scanf("%5d", &a);
如果输入“12345678”,则会把12345赋值给变量a,截去其余部分。例如:
scanf("%4d%4d", &a, &b);
如果输入“12345678”,则会把1234赋值给a,而把5678赋值给b。
❑ 长度。
长度格式符是l和h,l表示输入长整型数据(如%ld)和双精度浮点数(如%lf);而h则表示输入短整型数据。
在C语言中使用函数scanf时,必须注意以下6点。
(1)在函数scanf中没有精度控制,例如scanf("%5.2f",&a);是非法的。不能用此语句输入小数位数为两位的实数。
(2)scanf中要求给出变量地址,如给出变量名则会出错。例如scanf("%d",a);是非法的,应改为scanf("%d",&a);这才是合法的。
(3)在输入多个数据时,若格式控制字符串中没有使用非格式字符作为输入数据之间的间隔,则可用空格、制表符或回车符。在编译时如果遇到空格、Tab、Enter或非法数据(如对“%d”输入“12A”时,A即为非法数据),则认为该数据输入结束。
(4)在输入字符数据时,若格式控制字符串中无非格式字符,则认为所有输入的字符均为有效字符。例如:
scanf("%c%c%c", &a, &b, &c);
如果输入d e f,则会把d赋值给a,把空格赋值给b,把e赋值给c。只有当输入为def时,才能把d赋值给a,把e赋值给b,把f赋值给c。如果在格式控制中加入空格作为间隔,例如,
scanf ("%c %c %c", &a, &b, &c);
则输入时可在各数据之间加空格。
看下面的一段代码。
int main(void){ char a, b; printf("input character a, b\n"); scanf("%c%c", &a, &b); printf("%c%c\n", a, b); }
在上述代码中,因为在scanf函数"%c%c"中没有空格,所以输入“M N”后,输出结果中只有M。而输入改为MN时才可以输出MN两个字符。
(5)如果格式控制字符串中有非格式字符,则输入时也要输入该非格式字符。例如:
scanf("%d, %d, %d", &a, &b, &c);
其中,用非格式符“,”作为间隔符时,应为5、6、7。例如:
scanf("a=%d, b=%d, c=%d", &a, &b, &c);
此时输入应该为a=5,b=6,c=7。
(6)如果输入的数据与输出的类型不一致时,虽然编译能够通过,但结果将不正确。
看下面的一段代码。
int main(){ long a; printf("input a long integer\n"); scanf("%ld", &a); printf("%ld", a); }
当输入一个长整型数值123456789后,输出的数据也是123456789,即输入和输出数据完全相等,如图6-6所示。
图6-6 执行效果
实例6-5
通过函数scanf输出用户输入字符的ASCII码和对应的大写字母
源码路径daima\6\6-5
本实例的实现文件为“scanf.c”,具体实现代码如下:
int main(void) { char a, b, c; //声明3个字符变量 printf("input lowercase a, b, c\n"); scanf("%c, %c, %c", &a, &b, &c); //输入3个字母 //输出3个字符以及它们的大写字母 printf("%d, %d, %d\n%c, %c, %c\n", a, b, c, a-32, b -32, c-32); }
拓展范例及视频二维码
范例6-5-01:演示文本的输入和输出
源码路径:演练范例\6-5-01\
范例6-5-02:使用scanf()函数
源码路径:演练范例\6-5-02\
上述代码的具体实现流程如下所示。
(1)定义3个字符型的变量a、b和c。
(2)通过printf输出提示,提示用户输入3个小写字母。
(3)通过scanf将用户输入的数据存储到指定的变量中。
(4)输出对应的3个大写字母和ASCII码。
程序运行后会在界面窗口中提示输入小写字母,例如输入m、n、z,按下Enter键后将分别输出输入字符m、n、z对应的ASCII码和对应的大写字母,如图6-7所示。
图6-7 执行效果