C语言格式化输出问题
凌晨九点 Lv2

在日常使用中C语言时,对于命令行工具输出格式化控制非常重要,虽然每天都在用printf但是对其具体的使用还是很容易忘记,于是做如下总结

在 C 语言中,格式化打印主要通过 printfsprintfsnprintffprintf 等函数实现,它们都使用格式字符串来指定输出数据的类型和格式。格式字符串由普通字符和格式指定符组成,格式指定符用来指定随后参数的打印方式。

常用的格式指定符:

  • %d:输出有符号十进制整数。
  • %u:输出无符号十进制整数。
  • %x%X:输出十六进制整数,%x 输出小写字母,%X 输出大写字母。
  • %o:输出八进制整数。
  • %f:输出浮点数。
  • %e%E:输出指数形式的浮点数,%e 使用小写 e%E 使用大写 E
  • %g%G:输出浮点数,自动选择 %f%e/%E 的格式,取决于数值的大小。
  • %c:输出单个字符。
  • %s:输出字符串。
  • %p:输出指针的值(十六进制表示)。
  • %%:输出一个百分号 %

除了上述基本的格式指定符,还可以在 % 和格式字符之间插入一些标志、宽度、精度等修饰符:

标志方式

  • 标志
    • -:左对齐输出。
    • +:输出数值的正负号。
    • (空格):如果第一个字符不是正负号,则在该字符前添加一个空格。
    • #:对于 %o%x%X,添加前缀 00x0X;对于 %f%e%E,强制显示小数点;对于 %g%G,防止尾部零被删除。
    • 0:用零填充空位。

宽度和精度

  • 宽度:指定输出字段的最小宽度。如果输出小于这个宽度,会在左边或右边填充空格或零(取决于是否使用了 -0 标志)。

  • 精度

    • 对于 %f%e%E,精度表示小数点后的数字位数。
    • 对于 %g%G,精度表示有效数字的最大位数。
    • 对于 %s,精度表示输出字符串的最大长度。
    • 对于整数类型,精度表示最小数字位数,不足部分会填充零。

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>

int main() {
int i = 42;
float f = 3.14159;
char s[] = "Hello, World!";

printf("Integer: %d\n", i); // 基本整型输出
printf("Integer with width: %10d\n", i); // 宽度为10,右对齐
printf("Integer with width and zero padding: %010d\n", i); // 宽度为10,用零填充
printf("Float: %f\n", f); // 基本浮点数输出
printf("Float with precision: %.2f\n", f); // 保留两位小数
printf("String: %s\n", s); // 字符串输出
printf("String with precision: %.5s\n", s); // 只输出字符串的前5个字符

return 0;
}

注意事项

  • 确保格式指定符与提供的参数类型相匹配,否则可能会导致未定义的行为。
  • 使用 %s 输出字符串时,确保字符串以 null 结尾,否则可能会读取到不确定的数据。
  • 使用 % 打印百分号时,需要写成 %%
  • 注意 printf 家族函数的安全性问题,如缓冲区溢出。建议使用 snprintffgets/fputs 来避免这类问题。