表 25.1. printf转换说明的可选项
选项 | 描述 | 举例 |
---|---|---|
# | 八进制前面加0(转换字符为o ),十六进制前面加0x(转换字符为x )或0X(转换字符为X )。 | printf("%#x", 0xff) 打印0xff ,printf("%x", 0xff) 打印ff 。 |
- | 格式化后的内容居左,右边可以留空格。 | 见下面的例子 |
宽度 | 用一个整数指定格式化后的最小长度,如果格式化后的内容没有这么长,可以在左边留空格,如果前面指定了- 号就在右边留空格。宽度有一种特别的形式,不指定整数值而是写成一个* 号,表示取一个int 型参数作为宽度。 | printf("-%10s-", "hello") 打印-␣␣␣␣␣hello- ,printf("-%-*s-", 10, "hello") 打印-hello␣␣␣␣␣- 。 |
. | 用于分隔上一条提到的最小长度和下一条要讲的精度。 | 见下面的例子 |
精度 | 用一个整数表示精度,对于字符串来说指定了格式化后保留的最大长度,对于浮点数来说指定了格式化后小数点右边的位数,对于整数来说指定了格式化后的最小位数。精度也可以不指定整数值而是写成一个* 号,表示取下一个int 型参数作为精度。 | printf("%.4s", "hello") 打印hell ,printf("-%6.4d-", 100) 打印-␣␣0100- ,printf("-%*.*f-", 8, 4, 3.14) 打印-␣␣3.1400- 。 |
字长 | 对于整型参数,hh 、h 、l 、ll 分别表示是char 、short 、long 、long long 型的字长,至于是有符号数还是无符号数则取决于转换字符;对于浮点型参数,L 表示long double 型的字长。 | printf("%hhd", 255) 打印-1 。 |
常用的转换字符有:
表 25.2. printf的转换字符
转换字符 | 描述 | 举例 |
---|---|---|
d i | 取int 型参数格式化成有符号十进制表示,如果格式化后的位数小于指定的精度,就在左边补0。 | printf("%.4d", 100) 打印0100 。 |
o u x X | 取unsigned int 型参数格式化成无符号八进制(o)、十进制(u)、十六进制(x或X)表示,x表示十六进制数字用小写abcdef,X表示十六进制数字用大写ABCDEF,如果格式化后的位数小于指定的精度,就在左边补0。 | printf("%#X", 0xdeadbeef) 打印0XDEADBEEF ,printf("%hhu", -1) 打印255 。 |
c | 取int 型参数转换成unsigned char 型,格式化成对应的ASCII码字符。 | printf("%c", 256+'A') 打印A 。 |
s | 取const char * 型参数所指向的字符串格式化输出,遇到'\0' 结束,或者达到指定的最大长度(精度)结束。 | printf("%.4s", "hello") 打印hell 。 |
p | 取void * 型参数格式化成十六进制表示。相当于%#x 。 | printf("%p", main) 打印main 函数的首地址0x80483c4 。 |
f | 取double 型参数格式化成[-]ddd.ddd 这样的格式,小数点后的默认精度是6位。 | printf("%f", 3.14) 打印3.140000 ,printf("%f", 0.00000314) 打印0.000003 。 |
e E | 取double 型参数格式化成[-]d.ddde±dd (转换字符是e)或[-]d.dddE±dd (转换字符是E)这样的格式,小数点后的默认精度是6位,指数至少是两位。 | printf("%e", 3.14) 打印3.140000e+00 。 |
g G | 取double 型参数格式化,精度是指有效数字而非小数点后的数字,默认精度是6。如果指数小于-4或大于等于精度就按%e (转换字符是g)或%E (转换字符是G)格式化,否则按%f 格式化。小数部分的末尾0去掉,如果没有小数部分,小数点也去掉。 | printf("%g", 3.00) 打印3 ,printf("%g", 0.00001234567) 打印1.23457e-05 。 |
% | 格式化成一个% 。 | printf("%%") 打印一个% 。 |