3.5 scanf格式输入函数
scanf函数是一个标准库函数,其功能是通过键盘把数据输入到指定的变量之中,它的函数原型在头文件“stdio.h”中,与printf函数相同,C语言也允许在使用scanf函数之前不必包含stdio.h文件。scanf函数的一般形式如下。
scanf("格式字符串",输入项地址表);
格式字符串的组成和作用与printf函数相同,但非空白字符在输入有效数据时,必须原样一起输入,且不能显示,即不能显示提示字符串。
输入项地址表由最少一个或多个输入项地址组成,相邻两个输入项地址之间用逗号分开,输入项地址表中给出各变量的地址,地址是由取运算符“&”后跟变量名组成的。例如:&a、&b分别表示变量a和变量b的地址,它是由C编译系统分配的,一般用户不必关心具体的地址是多少。
【例3-9】
main() { 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); }
程序运行结果如图3-9所示。
图3-9 程序运行结果
本例中,由于scanf函数本身不能显示提示串,故先用printf语句在屏幕上输出提示,请用户输入a、b、c的值。执行scanf语句后等待用户输入。用户输入1□2tab3后按下回车键,变量a、b、c相应被赋值为1、2、3,程序继续执行,显示a=1,b=2,c=3。由于在格式字符串“%d%d%d”之间没有非格式字符作输入时的间隔,因此在输入时要用一个以上的空格或Tab键或回车键作为每两个输入数之间的间隔,故也能够以1□2□3输入或其他合法的方式输入。
3.5.1 scanf格式字符串
scanf格式字符串可以包含3种类型的字符。
① 空白字符。空格、Tab键,对数据输入没有影响。
② 非%且非空白字符的普通字符。必须在相应的位置原样输入。
③ 以%开头,以格式控制符结尾的格式说明,其形式如下。
% [*] [宽度] [b或l] 格式控制符
格式控制符可使用d、u、o、x、c、s、f、e、g,其代表的数据类型与printf函数中的相同。B、b、L、l的含义与printf函数中的一样,B、b用于char字符型,L、l用于long为长整型。
格式说明中的“*”用以表示该输入项读入后不赋予相应的变量,即跳过该输入值。例如“scanf("%d %*d %d",&a,&b);”,当输入为1□2□3时,把1赋予a,2被跳过,3赋予b。
宽度指定该项输入数据所需输入的字符数,系统根据需要截取,多余部分被舍弃。例如“scanf("%3c%3c",&ch1,&ch2);”,设输入“abcdefg”,则系统将读取的“abc”中的“a”赋给变量ch1;将读取的“def”中的“d”赋给变量ch2。又如“scanf("%5d",&a);”,设输入12345678,只把12345赋予变量a,其余部分被截去。
3.5.2 scanf数据输入操作
① scanf函数中没有精度控制,如“scanf("%5.2f",&a);”是非法的,不能企图用此语句输入小数为两位的实数。
② scanf中要求给出变量地址,如给出变量名则会出错,如“scanf("%d",a);”是非法的,应改为“scnaf("%d",&a);”才是合法的。
③ 在输入多个数值数据时,若格式字符串中没有非格式字符作输入数据之间的间隔,则可用空格或Tab或回车作间隔。C编译在碰到空格、Tab键、回车键或非法数据(如对“%d”输入“12A时”,A即为非法数据)时即认为该数据结束。
例如:设给n1输入12,给n2输入36,则执行命令“scanf("%d%d",&n1,&n2);”时,正确的输入操作为:
a 12□36↙ b 12 Tab 36↙ c 12↙ 36↙
④“格式字符串”中出现的普通字符(包括转义字符形式的字符),务必原样输入。
例如:设给n1输入12,给n2输入36,则执行命令“scanf("%d,%d",&n1,&n2);”时,正确的输入操作为:12,36↙。
又如:“scanf("n1=%d,n2=%d",&n1,&n2);”
正确的输入操作为:n1=12,n2=36↙
⑤ 在输入字符数据时,若格式控制串中无非格式字符,则认为所有输入的字符均为有效字符。例如:“scanf("%c%c%c",&a,&b,&c);”输入为d□e□f,则把'd'赋予a, □赋予b, 'e'赋予c。只有当输入为def时,才能把'd'赋于a,'e'赋予b,'f'赋予c。
C语言的格式输入scanf函数和输出printf函数规定比较烦琐,不必花许多精力去死抠每一细节,大致理解后,主要通过编程和调试去掌握其使用方法。