printf 函数转换说明完整格式详解

函数转换说明完整格式详解
相关文章链接
C99标准函数描述(英文原文)
C99标准函数描述(中文翻译)
概览
函数原型
int printf(const char * restrict format, ...);
函数的返回值为要传输到输出流的字符数 。为格式字符串,后面紧跟着不定数目的参数 。
格式字符串
一个典型的函数调用:
printf("1 + 1 = %+8d \r\n",2);
函数的第一个参数称为格式字符串,格式字符串由两部分组成——指示符和转换说明 。
指示符: 普通字符,将原样不动地复制到输出流中 。如上面的 “1 + 1 = ” 和 “ \r\n”。
转换说明: 由百分号(%)开始,消耗后续一个或多个参数,根据相应的转换说明符对它们进行转换 。如上面的 “%+8d”
转换说明
每个转换说明由百分号(%)开始,并以一个转换说明符结束 。一个完整的转换说明可能依次包含以下内容:
示例代码:
#include int main(void){printf("%d\r\n", 1024);//不指定宽度和精度printf("%8d\r\n", 1024); //指定8位宽度printf("%.6d\r\n", 1024); //指定6位精度printf("%8.6d\r\n", 1024); //指定8位宽度和6位精度printf("%*.*d\r\n", 8, 6, 1024); //指定8位宽度和6位精度return 0;}
标志字符
标志字符及其含义如下:
标志含义
转换的结果在字段内左对齐 。(如果没有指定这个标志,它就是右对齐的 。)
有符号转换的结果总是以加号或减号开始 。(如果未指定此标志,则只有在转换负值时才以符号开始 。)
空格
如果有符号转换的第一个字符不是符号,或者有符号转换不产生任何字符,则在结果前加一个空格 。如果空格和 + 标志同时出现,空格标志将被忽略 。
结果被转换为“另一种形式” 。对于 o 转换,当且仅当必要时,它会提高精度,强制结果的第一个数字为零(如果值和精度都为0,则打印单个0) 。对于 x(或 X)转换,一个非零结果有 0x(或 0X)前缀 。对于a,A,e,E,f,F,g 和 G 转换,浮点数转换的结果总是包含一个小数点字符,即使它后面没有数字 。(通常,只有在后面跟着一位数字时,小数点字符才会出现在这些转换的结果中 。)对于g和g转换,结果末尾的0不会被删除 。对于其他转换,行为是未定义的 。
对于 d,i,o,u,x,X,a,A,e,E,f,F,g,G 的转换,前导零(跟随在符号或基底表示后面)用于填充字段宽度,而不是执行空格填充,除非转换无穷大或非数值 。
#include int main(void){printf("%8d\r\n", 1024);//不使用标志字符printf("%-8d\r\n", 1024);//使用 - ,左对齐printf("%+8d\r\n", 1024);//使用 + ,显示正负号printf("% d\r\n", 1024);//使用空格,正号省略时填充空格printf("% +d\r\n", 1024);//同时使用 + 和 空格,正号覆盖空格printf("d\r\n", 1024);//使用 0 ,不足位补零printf("%8x\r\n", 0xff);//不使用标志符显示十六进制数printf("%#8x\r\n", 0xff);//使用 # 标志符号显示十六进制数return 0;}
长度修饰符
长度修饰符及其含义如下:
修饰符含义
hh
指定后面的 d,i,o,u,x 或 X 转换说明符应用于char 或char 实参(实参将根据整型提升而提升,但其值在打印之前应当转换为char 或char);或者后面的 n 转换说明符应用于指向char 实参的指针 。
指定后面的 d,i,o,u,x 或 X 转换说明符应用于 short int 或short int 实参(实参将根据整型提升而提升,但其值在打印前应当转换为 short int 或short int);或者后面的 n 转换说明符应用于指向 short int 实参的指针 。
指定后面的 d,i,o,u,x 或 X 转换说明符应用于 long int 或long int 实参;或者后面的 n 转换说明符应用于指向 long int 实参的指针;或者后面的 c 转换说明符应用于实参;或者后面的 s 转换说明符应用于指向实参的指针;对后面的 a,A,e,E,f,F,g 或 G 转换说明符没有影响 。
ll
指定后面的 d,i,o,u,x 或 X 转换说明符应用于 long long int 或long long int 实参;或者后面的 n 转换说明符应用于指向 long long int 实参的指针 。
指定后面的 d,i,o,u,x 或 X 转换说明符应用于或实参;或者后面的 n 转换说明符应用于指向实参的指针 。
指定后面的 d,i,o,u,x 或 X 转换说明符应用于或相应的有符号整数类型实参;或者后面的 n 转换说明符应用于指向与相对应的有符号整型实参的指针 。
指定后面的 d,i,o,u,x 或 X 转换说明符应用于或相应的无符号整型实参;或者后面的 n 转换说明符应用于指向实参的指针 。
指定后面的 a,A,e,E,f,F,g 或 G 转换说明符应用于 long参数 。
转换说明符
转换说明符及其含义:

printf 函数转换说明完整格式详解

文章插图
说明符含义
d,i
int 实参被转换成带符号的十进制形式,格式为 [?]dddd 。精度指定最少要输出的数字位数;如果要转换的值可以用更少的数字表示,则用前导零扩充 。默认精度为1 。使用精度为零对零值进行转换的结果是没有字符 。
o,u,x,X
int 实参被转换为无符号八进制(o),无符号十进制(u),或无符号十六进制表示法(x或X),格式为 dddd 。字母用于 x 转换,字母用于 X 转换 。精度指定最少要输出的数字位数;如果要转换的值可以用更少的数字表示,则用前导零扩充 。默认精度为1 。使用精度为零对零值进行转换的结果是没有字符 。
f,F
表示浮点数的实参被转换成 [?]ddd.ddd 样式的十进制表示法,小数位数由精度指定 。如果缺省精度,则默认值为6。如果精度为零且未指定 # 标志,则不会出现小数点字符 。如果出现小数点字符,则在其前面至少出现一位数字 。该值四舍五入到合适的数位 。
表示无穷大的实参被转换为 [-]inf 或者 [-] 中的一种样式,这是实现定义的 。表示 NaN 的实参被转换为 [-]nan 或 [-]nan(n-char-) 中的一种样式,具体哪种样式及任何 n-char- 的含义都是实现定义的 。对于 F 转换说明符,分别由 INF,或 NAN 替代 inf,或 nan 。
e,E
表示浮点数的实参被转换成 [?]d.ddde±dd 样式,在小数点字符之前有一位数字(如果实参是非零,则为非零),小数点后的位数取决于精度;如果缺省精度,则默认值为6。如果精度为零且未指定 # 标志,则不会出现小数点字符 。该值四舍五入到合适的数位 。E 转换说明符使用带 E 的数字而不是带 e 的数字引入指数 。指数总是包含至少两位数字,并且只包含表示指数所需的更多位数字 。如果值为零,则指数为零 。
表示无穷大或 NaN 的实参将按照 f 或 F 转换说明符的样式进行转换 。
g,G
【printf 函数转换说明完整格式详解】表示浮点数的实参以样式 f 或 e 进行转换(对于 G 转换说明符,则采用样式 F 或 E),精度指定有效数字的位数 。如果精度为零,则取为1 。所使用的样式取决于转换的值;样式 e(或 E)仅在转换后的指数小于?4或者大于或等于精度时使用 。除非指定了 # 标志,否则结果的小数部分会移除末尾的零;小数点字符只在后面跟着一位数字时出现 。
表示无穷大或 NaN 的实参将按照 f 或 F 转换说明符的样式进行转换 。
a,A
表示浮点数的实参被转换成 [?]0xh.hhhhp±d ,在小数点字符之前有个十六进制的数字(如果实参是规范化的浮点数,则该数字为非零,否则是未指定的),小数点字符后面的十六进制数的位数取决于精度 。如果缺省精度且为2的幂,则精度足以精确表示该值 。如果缺省精度且不是2的幂,那么精度足以区分类型的值,只是末尾的0可以忽略;如果精度为零且未指定 # 标志,则不会出现小数点字符 。字母用于 a 转换,字母用于 A 转换 。A 转换说明符使用 X 和 P 而不是 x 和 p 。指数总是至少包含一位数字,并且只包含表示2的十进制指数所需的更多位数字 。
表示无穷大或 NaN 的实参将按照 f 或 F 转换说明符的样式进行转换 。
如果没有 l 长度修饰符,则将 int 实参转换为char,并写入结果字符 。
如果存在 l 长度修饰符,则对实参进行转换,就像使用 ls 转换说明进行转换一样且没有精度,而实参指向含两个元素的数组的初始元素 。第一个元素包含 lc 转换说明的实参,第二个元素是空宽字符 。
如果没有 l 长度修饰符,实参应当是一个指向字符类型数组初始元素的指针 。数组中的字符被写入直到(但不包括)末尾的空字符 。如果指定了精度,则写入的字节数不会超过这个数 。如果精度没有指定或者大于数组的大小,数组中应该包含一个空字符 。
如果存在 l 长度修饰符,则实参必须是指向类型数组初始元素的指针 。数组中的宽字符被转换为多字节字符(每个都像是调用函数一样,在转换第一个宽字符之前,由对象描述的转换状态初始化为零)直到并包括结束的空宽字符 。生成的多字节字符被写入直到(但不包括)末尾的空字符(字节) 。如果没有指定精度,数组应该包含一个空宽字符 。如果指定一个精度,不会超过那么多字节被写入(包括转换序列,如果有的话),无论何时数组中应当包含一个空宽字符,为了使多字节字符序列长度与精度相等,该函数需要访问数组结束后的一个宽字符 。在任何情况下都不会写入部分多字节字符 。
实参应当是一个指向 void 的指针 。指针的值被转换成一个打印字符序列,以一种实现定义的方式 。
实参应当是一个指向有符号整数的指针,这个实参被写入通过调用写入输出流到目前为止的字符数 。不转换实参,只消耗一个实参 。如果转换说明包含任何标志、字段宽度或精度,则行为未定义
写入一个%字符 。不转换参数 。完整的转换说明为%% 。