单片机C语言编程实践
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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函数规定比较烦琐,不必花许多精力去死抠每一细节,大致理解后,主要通过编程和调试去掌握其使用方法。