全部博文(413)
分类: C/C++
2011-09-17 19:02:05
printf的格式修饰串由5部分组成:
%[flags][field-width][precision][length-modifier]convertion-type
前面的4个部分是可选的,它们的顺序是确定的不能更改。
1.%之后的第一个可选部分:
flags:
1)- :左对齐,默认是右对齐;
2)+ :有符号数显示正负号,默认正数不显示正好,负数显示负号;
3)# :用于在convertion-type=x输出hex进制时,在前面加上0x(#0x);
4)0 :用于在指定宽度不够时用0填充之,默认是用空格填充的;
5)空格:prefix by a space if no sign is generated;
第一个可选部分只有这5中情况。当没有出现这里的5中情况之一时,就说明没有指定flags格式化参数。
2.%之后的第二个可选部分:
field-width:
在%之后的大于0的正数,可能有多位,都是“宽度参数”。在格式化中出现的非0的整数以及出现的小数的正数部分只可能是一定是“宽度参数”。指定“宽度参数”时一般涉及到对齐或填充的问题,要用到flags.
3.%之后的第三个可选部分:
precision:
精度多数情况下是同field-width一起以小数的形式出现的,比如 %6.2f:表示field-width=6,而precision=2.精度也可以没有整数部分的小数的形式出现:%.2f表示precision=2.
4.%之后的第四个可选部分:
length-modifier: specifies the size of the argument
长度修饰参数,一般用于下列情况:
long int(字母l), long long int(字母ll), long double(L),
size_t(z), ptrdiff_t(t), short(h), char(hh)
示例:%ld表示long int;%lld表示long long int;%zd表示size_t等等
5.%最后的必须部分:
convertion-type:
类型转换参数,就是10进制,8进制,16进制,浮点数...
1)10进制只可能是d/i或u,即有符号和无符号两种情况
比如:%d, %ld, %lld, %u, %lu, %llu等
2)8进制:o (octal)
3)16进制:x (hex)
4)浮点数:f/F或e/E(科学计数法);g/G=[fFeE]
5)a/A:double以16进制科学技术法输出
6)字符:c (宽字符:C )
7)字符串:s (宽字符串:S )
8)void指针:p
一些特殊用法:(摘自网上)
<1>输出字符"%"要用连续两个%表示,如: <2>
printf("%f%%", 1.0/3);
输出0.333333%。
对于单精度数,使用%f格式符输出时,仅前7位是有效数字,小数6位.
对于双精度数,使用%lf格式符输出时,前16位是有效数字,小数6位.
对于m.n的格式还可以用如下方法表示
char ch[20];
printf("%*.*s\n",m,n,ch);
前边的*定义的是总的宽度,后边的定义的是输出的个数。分别对应外面的参数m和n 。我想这种方法的好处是可以在语句之外对参数m和n赋值,从而控制输出格式。