printf()的参数格式如下所示
%[flags][width][.precision][size]type
其中,type是必须要有的,而其他四个域是可选的。其中flags域用来控制输出是否包含正负号、空格、0、小数点和八进制或者十六进制标志的前缀。flags域中可以包含一个或多个符号来表示指令,这些符号出现的顺序是没有要求的。
1 对齐指令
printf()函数默认是右对齐的,例如
int i = 12;
printf("%6d", i);
其中,printf()函数中的参数“6”表示输出的长度是6,此时输出的结果是右对齐的,如图1所示。
图1 默认右对齐
在flags域中使用“-”符号使得输出变为左对齐,如图2所示。
printf("%-6d", i);
图2 对齐方式变为左对齐
2 输出正数有“+”
默认情况下,printf()函数只有在处理负数的时候才会输出其符号,处理正数时不会输出符号。可以将flags域设置为“+”,此时正数时会输出其符号,如图3所示。
int i = 12;
printf("%+d", i);
图3 输出“+”
3 补0指令
如果指定了输出结果的宽度,那么在宽度域前面的flags域中可以指定补0。
printf("%06d", i);
此时会在右对齐输出i的同时,将输出的空格位补0,如图4所示。
图4 补0
需要注意的是,如果此时flags域中含有“-”,即指定输出左对齐,则补0指令无效。
printf("%-06d", i);
此时的输出与图2相同。
4 输出空格
当要输出的是有符号的数字,并且是正数时,可以将flags域设置为空格,此时的输出前也相应有空格,如图5所示。
printf("% d", i);
图5 空格
当输出的数字是负数或者flags域中带有“+”指令时,空格指令无效。
printf("%+d", i);
此时的输出与图3输出相同。
5 #指令
当以八进制或者十六进制的格式输出指定数字时,即type的类型是“o”、“x”或者“X”时,flags域中的#指令的作用是为八进制或者十六进制添加前缀,如图6所示。
printf("%#x", i);
图6 添加前缀
需要注意的是,当type类型是“X”时,输出的前缀是“0X”。