C/C++ printf函数格式控制符的写法

2013年04月10日

C中printf函数的格式控制符一直不是特别明白。下面翻译一下cplusplus上的解释:

格式控制符主要由下面这几部分构成,中括号内的是可选项。

%[flags][width][.precision][length]specifier

下面依次介绍各个选项的含义。

flags

flags主要是用来控制显示细节的,其选项为:

flags 含义
- 默认右对齐,此选项设置左对齐
+ 即使为正数时仍显示+号
空格 对于一个正数,在前方显示一个空格(负数的话就直接负号,这样更美观)
# 与specifier合用,如#o:显示八进制(首位为0)、#x:十六进制(首位为0x)、#X:十六进制(首位为0X)、#[fFeEgGaA]:即使没有小数位也输出小数点
  输出数字时左边填0直至达到指定宽度

[width][.precision]

width是一个整数数字,表示输出的最小宽度,如果输出数据不够这么长,就以flags指定的方式填充0或空格。width也可以是*,然后具体数值可以通过后面的参数进行动态调整。

precision对不同的类型有不同的含义,同时也可以设置为*通过参数调整。

specifier 含义
整数类型(d, i, o, u, x, X) 最小输出宽度,不够的话在前面填0。若设置precision为0,那么输出0时将不被显示
浮点型(a, A, e, E, f, F) 小数点后的小数位数,默认为6
浮点型(g, G) 有效数字位数
字符串(s) 最长输出的长度,更长的会被截断

[length]specifier

下面这张表是常见数据类型的格式控制符,第一列是length控制符,后面各列是可选用的specifier符。

length specifier
d i u o x X f F e E g G a A c s p n
(none) int unsigned int double int char* void* int*
hh signed char unsigned char signed char*
h short int unsigned short int short int*
l long int unsigned long int wint_t wchar_t* long int*
ll long long int unsigned long long int long long int*
j intmax_t uintmax_t intmax_t*
z size_t size_t size_t*
t ptrdiff_t ptrdiff_t ptrdiff_t*
L long double

某一个数据类型可能有多种specifier,基本上是显示格式的差异,例如浮点类型的e和E分别表示以指数形式(表示指数的E大小写形式)输出数值,又如,g与G表示以指数形式或小数形式中较短的那个来显示数值。