printf函数可能大多数人都用过,但是我们一般都不会详细全面的研究它的诸多格式。今天有空做了一些测试,记录如下:
测试环境:VMware+Ubuntu10.04 (gcc v4.4.3)
1、函数代码如下:
int main(int argc, char **argv)
{
int a = 1234;
int b = 0x5678;
printf("%% 20d of 1234 is: % 20d\n", a);
printf("%%-20d of 1234 is: %-20d\n", a);
printf("%%+20d of 1234 is: %+20d\n", a);
printf("%%#20d of 1234 is: %#20d\n", a);
printf("%%020d of 1234 is: %020d\n", a);
printf("%%#20x of 0x5678 is: %#20x\n", b);
return 0;
}
得到的输出如下:
% 20d of 1234 is: 1234
%-20d of 1234 is: 1234
%+20d of 1234 is: +1234
%#20d of 1234 is: 1234
%020d of 1234 is: 00000000000000001234
%#20x of 0x5678 is: 0x5678
结论:
1、printf的格式部分定义如下:%[flags][width][.perc][F|N|h|l]type。因此格式字符数以%开始的,然后是flags(0个或1个),width(0个或1个),prec(以小数点开始的一个数字或没有),F/N/h/l/ll其中之一,最后是type(d,x,f,s,p等)。
2、flags有5种:一是空格,表示用空格填充。二是0,表示用0填充。三是减号,表示使用左对齐(默认是右对齐的)。四是加号,表示在数字前显示正负号。五是#,表示如果后面的type是x时打印的十六进制数前加0x。
3、width表示打印长度,不足的部分用空格或0填充。但是要注意一些默认处理,譬如如果同时设置了左对齐和零填充,那么0填充将自动转为空格填充。(因为如果在整数的后面填充0那打印值就错了)。
4、prec部分只在浮点数时有效,表示浮点数小数点后精确到的最多位数。
5、F/N/h/l/ll等,整数转换说明符,即对后面打印的整数进行强制转换后输出。譬如F表示远指针、N表示近指针、h表示将int强制截断为short输出,l表示将整数强制按long型输出,ll表示将整数强制按照long long输出。