TAG: printf
函数,标准输入输出
TEXT:
printf
函数是一个标准库函数,能够以精确的格式输出程序运算的结果。printf函数的调用格式为:
printf
(“格式控制字符串”,输出项列表);
printf
函数有两项参数:用“”引起来的格式控制字符串和向标准设备输出的数据。每次调用printf函数时都要包含描述输出格式的 “格式控制字符串”。
格式字符串是由格式字符(包括:转换说明符、标志、域宽、精度)和普通字符组成,转换说明符和百分号(%)一起使用,用来说明输出数据的数据类型、标志、长度和精度。
输出项列表可以是常量、变量和表达式,也可以没有输出项,这些输出项必须与格式控制字符串在类型和数量上完全对应,否则,结果将不可预测。当有多个输出项时,各个输出项之间用逗号‘,’分隔。
在使用printf函数时,当系统遇到输出的转换说明符后,会自动用后面对应的输出项的值代替它的位置,然后输出。格式控制字符串中的转换字符应与输出列表中的待输出项之间应一一对应,这些转换字符控制对应的输出项以该格式输出。数据类型必须与格式符相匹配。
格式控制字符串的一般形式:
% [
修饰符] 转换说明符
其中修饰符为可选项,包括标志修饰符、宽度修饰符、精度修饰符、长度修饰符,用于确定输出数据的宽度、精度、对齐方式等,用于产生更加规范、整齐、美观的数据输出形式,当没有修饰符时,以上各项按系统缺省值设定显示。
1
)转换说明符
转换说明符规定了对应输出项的输出格式,即将输出的数据转换为指定的格式输出。该项不能省略。常用的转换说明符及其含义见表3-3。
转换说明符
意义
C
按字符型输出
d
或i
按十进制整数输出
u
按无符号十进制整数输出
f
按浮点型小数输出
E
或e
按指数形式(科学计数法)输出
o
按八进制整数输出(不输出前缀o)
X
或x
按十六进制整数输出(不输出前缀ox)
s
按字符串输出
G
或g
按e和f格式中输出宽度较短的一种形式输出
表3-3 转换说明符及其含义
转换说明符要与%一起使用,不能省略%。上表中的字符只有放在%的后面才作为输出的转换说明。
例如:int max;
printf(
“%d”,max);
表示变量max的值以十进制整数形式输出。
又如:int d=15;
printf(
“d=%d”,d);
在该格式控制字符串中,第1个d不是输出格式字而是一个普通字符,需要按原字符形式输出,第3个d是一个变量名,是输出项,只有放在%后的第2个d才是转换说明符, 说明变量d的值(15)以十进制整数形式输出。输出格式是:d=15。
提示
printf
()函数中的格式字中,除格式说明符E、G、X外,其它格式说明符必须小写。
例1 输出格式控制符的使用。
main( )
{
int a1=+400,a2=-400;
float b=3.1415926,e=31415.26535898;
float g=3.140000;
char c='a';
double d=3.1415926535898;
printf("a1=%d/n",a1);
printf("a1=%o/n",a1);
printf("a1=%x/n",a1);
printf("a1=%u/n",a1);
printf("a2=%d/n",a2);
printf("a2=%u/n",a2);
printf("b=%f/n",b);
printf("e=%e/n",e);
printf("g=%g/n",g);
printf("d=%f/n",d);
printf("c=%c/n",c);
printf("s=%s/n", "Cprogram");
}
执行程序,输出结果为:
a1=400
a1=620
a1=190
a1=400
a2=-400
a2=65136
b=3.141593
e=3.141593e+04
g=3.14
d=3.141593
c=a
s=Cprogram
从输出结果可以看出:?只有减号(-)才会被打印出来,加号(+)是不打印的。?使用%u格式控制符打 印正整数时,该数不发生变化,但是打印负整数时,该负整数将被转换为无符号整数并打印出来。?缺省情况下,使用%f、%e、%E打印出来的值带有6个小数 位,如果小数位数不够6位,则在最后添0补位。?单精度数一般有7位有效数位。?使用%e和%E打印的带有指数的值,在指数前打印出字母e或E,同时小数 点左侧的数字仅打印一位(科学计数法)。双精度数可以用%f格式输出,它的有效位一般为16位,6位小数位。 %g不打印输出数据的小数部分尾部的0。
一个转换说明符是以%开始,以表3-2中的字符结束。其中可以插入修饰符。
2
)长度修饰符
常用的长度修饰符有两种:l(长)表示按长整型量输出,h(短)表示按短整型量输出。可以和输出转换说明符d、f、u等连用。其用法和含义见表3-4。
格式
意义
%ld
用于长整型数据的输出
%hd
用于短整型数据的输出
%lf
用于双精度型数据的输出
表3-4 长度修饰符的意义
例2 长度修饰符的使用。
main()
{
long int a=1234567;
int b=12345;
double d=1234567.123456789;
printf("a=%ld/n",a);
printf("b=%hd/n",b);
printf("d=%lf/n",d);
}
执行程序,结果如下:
a=1234567
b=12345
d=1234567.123457
例3-5 读入数据与输出数据类型的匹配。
main( )
{
int a;
printf(
“enter a data:/n”);
scanf
("%d",&a);
printf
("%d/n",a);
}
程序运行结果:
enter a data:
100000000
-520036096
由于输入数据的类型为整型,读入的数据本身已超出基本整型范围,使计算结果发生错误,同时,输出函数的输出格式字为长整型,造成输出结果与输入数据不相符。因此应将程序修改如下:
main( )
{
long int a;
clrscr();
printf("enter a data:/n");
scanf("%ld",&a);
printf("%ld/n",a);
}
enter a data:
10000000l
10000000
提示
输入长整型数据时,应在数据的后面加上字母‘l’或‘L’。
3
)宽度修饰符和精度修饰符
宽度修饰符用来指定printf()函数输出数据的占位宽度,用一个十进制整数表示输出数据的位数,插在百分号%与转换说明符之间,其作用是控制打印数据的宽度,也称为“域宽”。
也可以在prinf函数中指定输出数据的精度。以一个小数点开始,后紧跟着一个十进制整数表示精度,插 在百分号%与转换说明符之间。对于不同数据类型,精度的含义也不相同:在使用%d时,精度表示最少要打印的数字的个数。在使用%f、%e、%E时,精度是 小数点后面显示的数字个数。在使用%s时,精度表示输出的字符串中字符的个数。
提示
scanf
不允许指定精度输入。
宽度和精度也可以同时使用,其使用形式是:域宽.精度。
常用的宽度修饰符与精度修饰符说明以及含义见表3-5。
修饰符及说明格式
意义
%md
以宽度m输出整型数,不足m位数时左侧补以空格。
%0md
以宽度m输出整型数,不足m位数时左侧补以0(零)。
%m.nf
以宽度m输出实型数,小数位数为n位。
%ms
以宽度m输出字符串,不足m位数时左侧补以空格。
%m.ns
以宽度m输出字符串左侧的n个字符,不足m位数时左侧补以空格。
表3-5 宽度修饰符与精度修饰符说明
例3 宽度修饰符和精度修饰符的使用。
main()
{
printf("%3d/n",1);
printf("%3d/n",10);
printf("%3d/n",100);
printf("%3d/n",1000);
printf("%0.3d/n",1);
printf("%0.3d/n",10) ;
printf("%0.3d/n",100);
printf("%0.3d/n",1000);
printf("%.3d/n",1);
printf("%.3d/n",10);
printf("%.3d/n",100);
printf("%.3d/n",1000);
printf("%7.2f/n",123.4567);
printf("%5.2f/n",123.4567);
printf("%2.7f/n",123.4567);
printf("%5s/n","Cprogram");
printf("%7.3s/n","Cprogram");
printf("%2.6s/n","Cprogram");
}
执行程序,结果如下:
1
10
100
1000
001
010
100
1000
001
010
100
1000
123.46
123.46
123.4567000
Cprogram
Cpr
Cprogr
分析程序的结果,可以看出:
如果被打印的实际数据的宽度小于指定的宽度,则缺省下在宽度内为右对齐。左补空格或补0。直到总的数据个数满足宽度的要求。
当指定的输出数据宽度小于数据的实际宽度时,则按实际数据的位数输出打印(宽度自动增加);对于整数而言,按该数的实际宽度输出;对于浮点数,按实际位数输出,但如果制定了浮点数的精度,则相应的小数位按精度的位数四舍五入;对于字符串,按实际串长度输出。
通常情况下,精度用于描述浮点数的小数位数,但是,当采用精度描述整数或字符串时,如果被打印的整数数 据包含的数字个数小于指定的精度,就在被打印数据的前面加0,直到总的数字个数等于该精度为止。而对于被打印的字符串,则精度确定该字符串左侧的字符个 数,这些字符输出在指定域宽的右侧。不足域宽位数时左侧补以空格。
在实际程序应用中,还有一种更为灵活的宽度和精度的控制方法,用整型常量或整型变量的值作为输出数据的域宽和精度。方法是以“*”取代域宽修饰符和精度修饰符放在%的后面,以计算出来的整数表达式的值作为宽度和精度。
例如:float a=123.45;
printf
(“%*.*f”,6,1,a);
此处6为输出宽度,1为输出精度,输出结果为: 123.5,右对齐。
提示
没有为要打印的数据提供足够大的宽度,使得其他被打印的数据发生位置偏移,从而产生令人费解的输出格式。
4
)标志修饰符
在printf 函数中,可以使用标志修饰符控制输出格式。常见的标志修饰符见表3- 6。
标志修饰符
意义
-
“左对齐”方式:输出数据左对齐,右侧补空格。缺省时输出数据则为右对齐,左补格。
+
输出数据为正时,在数据之前显示一个+号,为负时,在数据之前显示一个-号。
#
输出数据为八进制时加前缀0,为十六进制时前缀0x。
空格
输出数据为正值时,在数据之前打印空格,为负时,数据之前显示一个-号。
表3-6 标志修饰符及其作用
例4 标志修饰符的使用。
main()
{
printf("%10d/n",123);
printf("%-10d/n",123);
printf("%10.2f/n",123.45678);
printf("%-10.2f/n",123.45678);
printf("%10s/n","Cprogram");
printf("%-10s/n","Cprogram") ;
printf("/n");
printf("%+5d/n",12345);
printf("%+5d/n",-12345);
printf("% 5d/n",12345);
printf("% 5d/n",-12345);
printf("/n");
printf("%#o/n",100);
printf("%o/n",100);
printf("%#x/n",100);
printf("%x/n",100);
}
执行程序,结果如下:
123
123
123.46
123.46
Cprogram
Cprogram
+12345
-12345
12345
-12345
0144
144
0x64
64
提示
数据输出时,注意输出格式基对齐方式的统一,否则造成输出数据难以读懂。
例如:int x=123,y=456;
printf(
“%3d%-3d”,x,y);
其结果是:123456
5
)普通字符
格式控制字符串中可以包含大量的可打印字符和转义字符,可打印字符主要是一些说明字符,这些字符将按原书写样式显示在屏幕上,如果有汉字系统支持,也可以输出汉字。转义字符是不可打印字符,用以控制产生特殊的输出效果。
例如:int a=123,b=12345;
printf("a=%d,",a);
printf("b=%d/n",b);
其输出结果为:a=123,b=12345
在第一个printf函数的格式控制字符串中,’a’、’=’和’,’都是普通字符,可以打印出来。第 二个printf函数的格式控制字符串中的’b’和’=’也是可打印字符,但/n时是转义字符,不能够打印出来,表示要换行输出。将该程序改动一下,其输 出形式也将发生改变。
int? a=123,b=12345;
printf("a=%d/n",a);
printf("b=%d/n",b);
输出形式为:a=123
b=12345
在第一个printf函数的格式控制字符串中,a和=是普通字符,打印出来。’/n’虽然没有打印出来,但是它指示第二个printf函数换到下一行左侧输出。