putchar()函数和getchar()函数只能输出和输入一个字符,若要同时输入多种数据类型的数据,则可以使用格式输入输出函数。这种函数不但能输入输出各种类型的数据,而且还可以控制数据输入输出时每个数据的输入输出格式。
printf()函数的作用:向计算机系统默认的输出设备(一般指显示器)输出一个或多个任意类型的数据。printf函数的调用格式:
printf(“格式控制”,输出表列)
如:printf("%d,%d/n",a,b);
1.格式控制
格式控制也称“转换控制字符串”,是由双引号括起来的字符串,用于指定输出格式。它由以下三部分组成:
(1)格式说明:
由“%”字符开始,在“%”后面跟有各种格式字符,以说明输出数据的类型、形式、长度、小数位等格式。如 “%d”表示按十进制整型输出,“%f”表示按实型数据输出6位小数,“%c”表示按字符型输出等。C语言中提供的格式字符如表3.1所示。
表3.1 printf格式字符
格式字符 |
说明 |
d |
以十进制形式输出带符号的整数 |
u |
用来输出unsigned型整数,以十整制无符号形式输出整数 |
o |
以八进制无符号形式输出整数 |
x |
以十六进制无符号形式输出整数 |
c |
用来输出单个字符 |
s |
用来输出一个字符串,以'/0'为结束标志 |
f |
以十进制形式输出实数(单精度和双精度浮点数),以小数形式输出 |
e |
以十进制指数形式输出实数 |
g |
用来输出实数(单精度和双精度浮点数),并根据数值大小自动取f格式符或e格式符(选择输出时字段宽度较小的一种),且不输出无意义的零 |
(2)普通字符:
普通字符输出时将原样输出。其作用是作为输出时数据的间隔,在显示中起提示作用。象printf函数中双引号内的逗号、空格和普通的字母等。
如:printf("x=%d,%c",12,6*8); 中“x=”和 “,”都是普通字符。此语句的输出结果是:x=12,48
(3)转义字符:
常用的有Tab键'/t'、回车换行'/n'等。
如: printf("x=%d/n",x,);
函数中双引号内的'/n'就是一个换行符,它的作用是输出完x的值后将产生一个“换行”操作。常用的转义字符见第2章表2.1。
这里的普通字符和转义字符均为非格式字符。
2.输出表列
需要输出的数据项,由若干表达式组成,表达式之间用逗号分隔。特别注意的是,这些表达式虽然用逗号分隔,但不是逗号表达式,而且计算的顺序是自右向左进行的。
注意:格式字符串中的格式字符和各输出项在数量和类型上应该一一对应。
3.附加说明字符
在格式说明中,在%和格式字符间可以插入表3.2中的几种附加说明符。
表3.2 printf的附加格式说明符
字符 |
说明 |
字母l |
用于长整型,可加在格式符d、o、x、u的前面 |
m(代表一个正整数) |
数据输出时的最小宽度 |
n(代表一个正整数) |
对实数表示输出n位小数,对字符串则表示截取的字符个数 |
- |
输出的数字或字符在域内向左靠 |
例如:%4d 表示输出列宽为4的整型数,不够4位右对齐。 %-10d 表示输出列宽为10的整型数,不够10位左对齐。
%7.2f 表示输出列宽为7的浮点数,其中小数位为2,整数为4,小数点占一位,不够7位右对齐。
%8.5s 表示列宽为8,显示5个字符的字符串。字符串不够8位右对齐。
%ld 表示输出long整数。
如果字符串的长度或整型数位数超过说明的列宽,则按其实际长度输出。但对浮点数,若整数部分超过了说明的整数位宽度,将按实际整数位输出;若小数部分位数超过了说明的小数位宽度,则按说明的列宽以四舍五入输出。
【例3.4】格式输出函数使用举例
main()
{int n1=45;
float f1=123.456;
char c1='a';
printf("n1=%d,n1=%od,n1=%x,n1=%u/n",n1,n1,n1,n1);
printf("f1=%f,f1=*%9.2f,f1=%-9.2f*/n",f1,f1,f1);
printf("c1=%c,c1=*%3c,c1=%-3c*,c1=%d/n",c1,c1,c1,c1);
printf("%s,%3s,%7.2s,%-5.3s*/n","china","china","china","china");
}
输出结果为:
n1=45,n1= 55,n1=2d,n1=45
f1=123.456000,f1=*VVV123.46,f1=123.46VVV*
c1=a,c1=VVa,c1=aVV,c1=97
china,china,VVVVVch,chiVV*
注意:(1)第二个输出语句的输出结果中间的数字123.456前有三空格,最后一个数字123.46后也有三个空格。
(2) 第三个输出语句的输出结果中间的字母a前有二个空格,在第三个字母a后也有二个空格。
在使用printf函数时,还应注意以下几点:
(1)除了x、e、g这三个格式符既可用小写也可用大写外,其他格式符必须用小写字母。如%d不能写成%D等。
(2)格式符d可用i代替,d和i在作为格式符使用时,两者作用一致。
(3)上面介绍的d、o、x、u、c、f、e、g等字符,如用在“%”后面则作为格式符号,如不在“%”后面则仅仅是一个普通字符而已。
如有语句:printf("t=%fs,y=%fg",t,y);
则第一个格式符为“%f ”,不包含其后的“s”;第二个格式符为“%f”,同样也不包含其后的“g”。其它字符如前所属,应原样输出。
若想输出字符“%”,则应在“格式控制字符串”中用两个连续的%表示,如: printf("%f%%/n",1.0/3.0);此时输出结果为:0.333333%。
(4)在使用“f”格式符输出实数时,并非全部数字都是有效数字。单精度实数的有效位数一般为7位,双精度实数的有效位数一般为16位。
如:已知x=111111.111,y=222222.222
则语句:printf("%f/n",x+y);
运行结果为:333333.328125。
显然只有前面的7位数字是有效数字。后面的数字是无意义的。
scanf( )函数的功能:从键盘按照“格式控制字符串”中规定的格式输入若干个数据,按“变量地址表列”中变量的顺序,依次存入对应的变量中。
scanf函数是一个标准库函数,它的函数原型在头文件“stdio.h”中,和printf函数一样,也不要求在使用scanf函数之前必须使用文件包含命令:#include <stdio.h>。
scanf函数的调用格式:
scanf(格式控制字符串,变量地址表列)
1.格式控制:
是由双引号括起来的字符串,和printf函数中的“格式控制字符串”含义相同,其中的格式说明,也和printf函数的格式说明相似,以“%”字符开始,以一个格式字符结束,中间可以插入附加的字符。
在格式控制字符串中若有普通的字符,则输入时原样输入。
例如:scanf("%d,%c,%f",&n,&p,&x);
这里的“%d,%c,%f”和格式输出时一样,也是格式控制字符串,控制数据输入时的格式。
2变量地址表列”是用逗号分隔的若干接收输入数据的变量地址。变量地址由地址运算符“&”后跟变量名组成。变量地址之间用逗号“,”分隔。
如“&n”、“&p”、“&x”就是变量的地址表列。&a,&b,&x分别表示变量a、变量b、变量x的地址。这个地址就是编译时系统在内存中给变量a、变量b、变量x分配的地址。注意变量与变量的地址的区别。对于地址的概念,在本书的第八章将会再作介绍。
【例3.5】格式输入函数的使用。要求给变量a、b、c分别赋值2、3、4,给变量x、y、x分别赋值5、6、7。
Main()
{int a,b,c,x,y,z;
scanf("%d,%d,%d",&a,&b,&c);
scanf("x=%d,y=%d,z=%d",&x,&y,&z);
printf("%d,%d,%d",a,b,c);
printf("x=%d,y=%d,z=%d",x,y,z);
}
运行时的输入格式为:
2,3,4↙
x=5,y=6,z=7↙
输出结果为:
2,3,4
x=5,y=6,z=7
请注意以上两个输入语句在输入数据时的区别。
3.输入格式字符
输入格式字符见表3.2所示。
putchar()函数和getchar()函数只能输出和输入一个字符,若要同时输入多种数据类型的数据,则可以使用格式输入输出函数。这种函数不但能输入输出各种类型的数据,而且还可以控制数据输入输出时每个数据的输入输出格式。