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的infinitynan 为小写,大写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
2
3
4
5
6
7
8
9
printf("%6d\n", 123);//输出   123(前面三个空格)

printf("%06d\n", 123);//输出000123

printf("%0*d\n", 6, 123);//输出000123,与上面的语句等价

printf("%06d\n", 123456789);//输出123456789

printf("%06s\n", "123456789");//输出123456789(不会截断,区别于精度!)

精度

  • 对于浮点数,它定义了小数点后的位数。
  • 对于字符串,它限制了最大字符数。
  • 对于整数类型,它指定了最少的数字位数,不足的部分以0填充。(区别于宽度,宽度默认以空格填充)
  • 如果省略,对于某些类型(如%g%G),则意味着“尽可能高的精度”。

如果精度填入星号 (*),则从参数列表中获取精度(类似上面的宽度)

与宽度不同的是,精度规范可能导致输出值截断或浮点值舍入

如果精度为 0 且要转换的值为 0,则无字符输出

示例代码:

1
2
3
4
5
6
7
8
9
10
11
printf("%.0d\n", 0);//不会输出任何内容

printf("%.6d\n", 123);//输出000123

printf("%.3f\n", 3.14159265);//四舍五入保留三位小数,输出3.142

printf("%.*f\n", 3, 3.14159265); //输出3.142,与上面的语句等价

printf("%.6s\n", "123456789");//对字符串截断到6位,仅输出123456(会截断,区别于宽度!)

printf("%.6d\n", 123456789);//对整数不会进行截断,输出123456789

参数大小

参数类型前缀
int8hh
int16h
int32I32l(小写L)
int64jI64ll(小写L)
doublel(大小写L均可)

示例代码:

1
2
3
4
5
6
7
8
9
//输出1099511627775
int64_t a = 0xffffffffff;
printf("%lld\n", a);
printf("%I64d\n", a);
printf("%jd\n", a);

//输出3.14159265358979
double b = 3.14159265358979;
printf("%.14lf\n", b);

一些特殊修饰符

%n$ 位置参数,用于指定参数位置(gcc非标拓展,msvc不支持)

1
printf("%2$d %1$d",10,20 ); //输出20 10

C语言字符串格式化详解
https://crackme.net/articles/string_formatter/
作者
Brassinolide
发布于
2024年11月30日
许可协议