从官方文档中copy过来的,当作一个记录方便查阅
格式化字符串(format string)是一些程序设计语言的输入/输出库中能将字符串参数转换为另一种形式输出的函数。例如C、C++等程序设计语言的printf类函数,其中的转换说明(conversion specification)用于把随后对应的0个或多个函数参数转换为相应的格式输出;格式化字符串中转换说明以外的其它字符原样输出
格式化字符串通过使用占位符来指出说明输出的参数是如何格式化的,他的基本格式如下:
%[parameter][flags][field width][.precision][length]type
| 字符 | 描述 |
|---|---|
| n$ | n是用这个格式说明符(specifier)显示第几个参数;这使得参数可以输出多次,使用多个格式说明符,以不同的顺序输出。 注意:如果任意一个占位符使用了parameter,则其他所有占位符必须也使用parameter; |

注意:格式化字符串也算作一个参数
#include
int main(){
printf("%2$d %2$#x %1$d %1$#x", 15, 16);
return 1;
}
| 字符 | 描述 |
|---|---|
| + | 总是表示有符号数值的’+‘或’-'号,缺省情况是忽略正数的符号。仅适用于数值类型 |
| SPACE | 使得有符号数的输出如果没有正负号或者输出0个字符,则前缀1个空格。如果空格与’+'同时出现,则空格说明符被忽略 |
| - | 左对齐,缺省情况下是右对齐 |
| # | 对于’g’与’G’,不删除尾部0以表示精度。对于’f’, ‘F’, ‘e’, ‘E’, ‘g’, ‘G’, 总是输出小数点。对于’o’, ‘x’, ‘X’, 在非0数值前分别输出前缀0, 0x, and 0X表示数制 |
| 0 | 如果width选项前缀以0,则在左侧用0填充直至达到宽度要求 |

给出显示数值的最小宽度,典型用于制表输出时填充固定宽度的表目。
实际输出字符的个数不足域宽,则根据左对齐或右对齐进行填充(实际长度小于格式化长度)
实际输出字符的个数超过域宽并不引起数值截断,而是显示全部宽度值(实际长度大于等于格式化长度)

通常指明输出的最大长度,依赖于特定的格式化类型

指出浮点型参数或整型参数的长度:
| 字符 | 描述 |
|---|---|
| hh | 对于整数类型,printf期待一个从char提升的int尺寸的整型参数 |
| h | 对于整数类型,printf期待一个从short提升的int尺寸的整型参数 |
| l | 对于整数类型,printf期待一个long尺寸的整型参数;对于浮点类型,printf期待一个double尺寸的整型参数;对于字符串s类型,printf期待一个wchar_t指针参数;对于字符c类型,printf期待一个wint_t型的参数 |
| ll | 对于整数类型,printf期待一个long long尺寸的整型参数。Microsoft也可以使用I64 |
| L | 对于浮点类型,printf期待一个long double尺寸的整型参数 |
| z | 对于整数类型,printf期待一个size_t尺寸的整型参数 |
| j | 对于整数类型,printf期待一个intmax_t尺寸的整型参数 |
| t | 对于整数类型,printf期待一个ptrdiff_t尺寸的整型参数 |
Type,也称转换说明(conversion specification/specifier)
| 字符 | 描述 |
|---|---|
d, i | 有符号十进制数值int。‘%d’与’%i’对于输出是同义;但对于scanf()输入二者不同,其中%i在输入值有前缀0x或0时,分别表示16进制或8进制的值。如果指定了精度,则输出的数字不足时在左侧补0。默认精度为1。精度为0且值为0,则输出为空 |
u | 十进制unsigned int。如果指定了精度,则输出的数字不足时在左侧补0。默认精度为1。精度为0且值为0,则输出为空 |
f, F | double型输出10进制定点表示。'f’与’F’差异是表示无穷与NaN时,‘f’输出’inf’, ‘infinity’与’nan’;‘F’输出’INF’, ‘INFINITY’与’NAN’。小数点后的数字位数等于精度,最后一位数字四舍五入。精度默认为6。如果精度为0且没有#标记,则不出现小数点。小数点左侧至少一位数字 |
e, E | double值E版本使用的指数符号为E(而不是e)。指数部分至少包含2位数字,如果值为0,则指数部分为00。Windows系统,指数部分至少为3位数字,例如1.5e002 |
g, G | double型数值,精度定义为全部有效数字位数 |
x, X | 16进制unsigned int。'x’使用小写字母;'X’使用大写字母 |
o | 8进制unsigned int |
s | 如果没有用l标志,输出null结尾字符串直到精度规定的上限;如果没有指定精度,则输出所有字节。如果用了l标志,则对应函数参数指向wchar_t型的数组,输出时把每个宽字符转化为多字节字符,相当于调用wcrtomb函数。 |
c | 如果没有用l标志,把int参数转为unsigned char型输出;如果用了l标志,把wint_t参数转为包含两个元素的wchart_t数组,其中第一个元素包含要输出的字符,第二个元素为null宽字符。 |
p | void *型 |
a, A | double型的16进制表示 |
n | 不输出字符,但是把已经成功输出的字符个数写入对应的整型指针参数所指的变量。 |
% | %字面值,不接受任何flags, width, precision or length |
炒一下冷饭:
在格式化字符串中 % 是存在特别意义的,我们要打印百分号必须使用2个 % 才能在控制台上打印出一个 %
在格式化字符串中 / 常用来表示转义字符,我们需要打印反斜杠的话必须使用两个反斜杠打印
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oevF5sTq-1659951255467)(E:\newStart\PWN\image-20220808172945215.png)]
台上打印出一个 %
在格式化字符串中 / 常用来表示转义字符,我们需要打印反斜杠的话必须使用两个反斜杠打印
