C语言字符串格式化详解
最近在C语言课上见到了一些奇怪的printf格式化参数,正好我对这方面也不是很懂,所以就参考一些文章总结了一下
1 |
|
类型
类型 | 参数 | 说明 |
---|---|---|
c (小写) | 字符 | 与 printf 函数一起使用时,指定单字节字符;与 wprintf 函数一起使用时,指定宽字符 |
C (大写) | 字符 | 与 printf 函数一起使用时,指定宽字符;与 wprintf 函数一起使用时,指定单字节字符 |
d | 整数 | 带符号十进制整数(d和i主要区别在scanf中,d明确表示十进制整数,比如输入0x1A将被解析为0。而i更灵活,可以自动识别不同的基数,比如输入0x1A将被解析为26) |
i | 整数 | 同上 |
u | 整数 | 无符号十进制整数 |
o | 整数 | 无符号八进制整数 |
x (小写) | 整数 | 无符号十六进制整数,小写x输出小写字母,例如aabb。大写X输出大写字母,例如AABB |
X (大写) | 整数 | 同上 |
e | 浮点 | 有符号浮点(科学计数法表示)。e使用小写e来表示指数,例如1.234568e+05。E使用大写E来表示指数,例如1.234568E+05 |
E | 浮点 | 同上 |
f | 浮点 | 有符号十进制浮点(固定小数点表示),小写f的infinity 和 nan 为小写,大写F为大写 |
F | 浮点 | 同上 |
g | 浮点 | 以最紧凑的形式输出浮点数,自动选择是固定小数点表示法还是科学计数法。g和G的区别也在大小写上 |
G | 浮点 | 同上 |
a | 浮点 | 有符号十六进制浮点(类科学计数法表示),例如双精度3.14159输出0x1.921f9f01b866ep+1。a和A的区别也在大小写上 |
A | 浮点 | 同上 |
n | 指向整数的指针 | 一个特殊的类型,不用来格式化数据,而是记录到目前为止已成功输出(或输入)的字符数量。例如语句printf("Hello World%n", &a); 执行完后变量a的值为11。由于安全原因,msvc已禁用此类型 |
p | 指针 | 以十六进制形式输出变量地址 |
s (小写) | 字符串 | 与 printf 函数一起使用时,指定单字节或多字节字符串;与 wprintf 函数一起使用时,指定宽字符字符串。 将于第一个空字符之前或达到精度值时显示字符。 |
S (大写) | 字符串 | 与 printf 函数一起使用时,指定宽字符字符串;与 wprintf 函数一起使用时,指定单字节或多字节字符串。 将于第一个空字符之前或达到精度值时显示字符。 |
标志
标志 | 说明 | 默认值 |
---|---|---|
- | 左对齐 | 右对齐 |
+ | 不论正数还是负数,都添加符号前缀(+或 -) | 只对负数添加符号前缀(-) |
# | 输出非十进制数时自动添加前缀(0 0x 0X) | 不添加前缀 |
输出固定小数点表示的浮点数时确保小数点总是存在(即使小数部分没有数字) | 小数部分无数字将被忽略 | |
0 | 当与宽度一起使用时,用零填充空白区域 | 用空格填充空白区域 |
宽度
定义了最小的字段宽度,不足宽度的将被自动填充
如果宽度填入星号 (*
),则从参数列表中获取宽度
示例代码:
1 |
|
精度
- 对于浮点数,它定义了小数点后的位数。
- 对于字符串,它限制了最大字符数。
- 对于整数类型,它指定了最少的数字位数,不足的部分以
0
填充。(区别于宽度,宽度默认以空格填充) - 如果省略,对于某些类型(如
%g
和%G
),则意味着“尽可能高的精度”。
如果精度填入星号 (*
),则从参数列表中获取精度(类似上面的宽度)
与宽度不同的是,精度规范可能导致输出值截断或浮点值舍入
如果精度为 0 且要转换的值为 0,则无字符输出
示例代码:
1 |
|
参数大小
参数类型 | 前缀 |
---|---|
int8 | hh |
int16 | h |
int32 | I32 或l (小写L) |
int64 | j 或I64 或ll (小写L) |
double | l (大小写L均可) |
示例代码:
1 |
|
一些特殊修饰符
%n$
位置参数,用于指定参数位置(gcc非标拓展,msvc不支持)
1 |
|
C语言字符串格式化详解
https://crackme.net/articles/string_formatter/