转换说明
请求 printf() 函数打印数据的指令要与待打印的数据类型相匹配。例如打印整数时使用 %d ,打印字符时使用 %c 。这些符号被称为转换说明(conversion specification),它们指定了如何把数据转换成可显示的形式。下面会列举出一些 ANSI C 标准为 printf() 提供的转换说明和各自对应的输出类型。
表1 转换说明及其打印的输出结果
转换说明 | 输出 |
---|---|
%a | 浮点数、十六进制数和p记数法(C99/C11) |
%A | 浮点数、十六进制数和p记数法(C99/C11) |
%c | 单个字符 |
%d | 有符号十进制整数 |
%e | 浮点数,e计数法 |
%E | 浮点数,e计数法 |
%f | 浮点数,十进制计数法 |
%g | 根据值的不同,自动选择 %f 或 %e。%e 格式用于指数小于-4 或者大于或等于精度时 |
%G | 根据值的不同,自动选择 %f 或 %E。%E 格式用于指数小于-4 或者大于或等于精度时 |
%i | 有符号十进制整数(在printf中与%d相同) |
%o | 无符号8进制整数 |
%p | 指针 |
%s | 字符串 |
%u | 无符号十进制整数 |
%x | 无符号十六进制整数,使用十六进制数 0f |
%X | 无符号十六进制整数,使用十六进制数 0F |
%% | 打印一个百分号 |
转换说明修饰符
在%和转换字符之间插入修饰符可修饰基本的转换说明。下面两个表格列出了可作为修饰符的合法字符。如果要插入多个字符,其书写顺序应该与表2中所列出的顺序相同。不是所有的组合都可行。表中有些字符是 C99 新增的,如果编译器不支持 C99,则可能不支持表中的所有项。
表2 printf() 的修饰符
修饰符 | 含义 |
---|---|
标记 | 表3 描述了5种标记(-、+、空格、#和0),可以不使用标记或使用多个标记 示例:"%-10d" |
数字 | 最小字段宽度 如果该字段不能容纳待打印的数字或字符串,系统会使用更宽的字段 示例:"%4d" |
.数字 | 精度 对于%e、%E、和%f 转换,表示小数点右边数字的位数 对于%g 和%G 转换,表示有效数字最大位数 对于%s 转换,表示待打印字符的最大数量 对于整型转换,表示待打印数字的最小位数 如有必要,使用前导 0 来达到这个位数 只使用.表示其后跟随一个0,所以%.f 和%.0f 相同 示例:"%5.2f"打印一个浮点数,字段宽度为5字符,其中小数点后有两位数字 |
h | 和整型转换说明一起使用,表示 short int 或 unsigned short int 类型的值 示例:"%hu"、"%hx"、"%6.4hd" |
hh | 和整型转换说明一起使用,表示 signed char 或 unsigned char 类型的值 示例:"%hhu"、"%hhx"、"%6.4hhd" |
j | 和整型转换说明一起使用,表示 intmax_t 或 uintmax_t 类型的值。这些类型定义在 stdint.h 中 示例:"%jd"、"%8jx" |
l | 和整型转换说明一起使用,表示 long int 或 unsigned long int 类型的值 示例:"%ld"、"%8lu" |
ll | 和整型转换说明一起使用,表示 long long int 或 unsigned long long int 类型的值(C99) 示例:"%lld"、"%8llu" |
L | 和整型转换说明一起使用,表示 long double 类型的值 示例:"%Lf"、"%10.4Le" |
t | 和整型转换说明一起使用,表示 ptrdiff_t 类型的值。ptrdiff_t 是;两个指针差值的类型(C99) 示例:"%td"、"%12ti" |
z | 和整型转换说明一起使用,表示 size_t 类型的值。size_t 是 sizeof 返回的类型(C99) 示例:"%zd"、"%12zd" |
注意 类型可移植性
sizeof 运算符以字节为单位返回类型或者的大小。这应该是某种形式的整数,但是标准只规定了该值是无符号整数。在不同的实现中,他可以是 unsigned int、unsigned long 甚至是 unsigned long long。因此,如果要用printf()函数显示 sizeof 表达式,根据不同系统,可能使用%u、%lu、%llu。这意味着要查找你当前系统的用法,如果把程序移植到不同的系统还要进行修改。鉴于此,C 提供了可移植性更好的类型。首先,stddef.h 头文件(在包含 stdio.h 头文件时已包含其中)把 sizet 定义成系统使用 sizeof 返回的类型,这被称为底层类型(underlying type)。其次 printf() 使用 z 修饰符表示打印相应的类型。同样,C 还定义了 ptrdiff_t 类型和 t 修饰符来表示系统使用的两个地址差值的底层有符号整数类型。注意 类型可移植性
sizeof 运算符以字节为单位返回类型或者的大小。这应该是某种形式的整数,但是标准只规定了该值是无符号整数。在不同的实现中,他可以是 unsigned int、unsigned long 甚至是 unsigned long long。因此,如果要用printf()函数显示 sizeof 表达式,根据不同系统,可能使用%u、%lu、%llu。这意味着要查找你当前系统的用法,如果把程序移植到不同的系统还要进行修改。鉴于此,C 提供了可移植性更好的类型。首先,stddef.h 头文件(在包含 stdio.h 头文件时已包含其中)把 sizet 定义成系统使用 sizeof 返回的类型,这被称为底层类型(underlying type)。其次 printf() 使用 z 修饰符表示打印相应的类型。同样,C 还定义了 ptrdiff_t 类型和 t 修饰符来表示系统使用的两个地址差值的底层有符号整数类型。注意 float 参数的转换
对于浮点类型,有用于 double 和 long double 类型的转换说明,却没有 float 类型的转换说明。这是因为在 K&R C 中,表达式或参数中的 float 类性值会被自动转换成 double 类性。一般而言,ANSI C 不会把 float 自动转换成 double。然而有大量的现有程序都假设 float 类型的参数被自动转换成 double 类型,为了保护这些程序,printf() 函数中所有 float 类型的参数(对未使用显式原型的所有 C 函数都有效)仍自动转换成 double 类型。因此,不论是 K&R C 还是 ANSI C,都没有显示 float 类型值专用的转换说明。
表3 printf() 中的标记
标记 | 含义 |
---|---|
- | 待打印项左对齐。即,从字段的左侧开始打印该项 示例:"%-20s" |
+ | 有符号值若为正,则在值前面显示加号;若为负,则在值前面显示减号 示例:"%d+6.2f" |
空格 | 有符号值若为正,则在值前面显示前导空格(不显示任何符号);若为负,则在值前面显示减号+标记并覆盖空格 示例:"% 6.2f" |
# | 把结果转换成另一种形式。如果是%o 格式,则以 0 开始;如果是 %x 或 %X 格式,则以 0x 或 0X 开始;对于所有的浮点格式,#保证了即使后面没有任何数字,也打印一个小数点字符。对于%g 和 %G 格式,#防止结果后面的 0 被删除 示例:"%#o"、"%#8.0f"、"%+#10.3e" |
0 | 对于数值格式,用前导 0 代替空格填充字段宽度。对于整数格式,如果出现-标记或指定精度,则忽略该标记 示例:"%010d"和"%08.3f" |
内容部分引自 人民邮电出版社《C Primer Plus(第6版)中文版》仅供学习及参考使用
内容部分引自 维基百科 仅供学习及参考使用
原创文章,作者:kai233,如若转载,请注明出处:https://www.sorkai.com/archives/124