【C语言】格式化输出

格式化输出

一、输出整数时

printf 函数中,%d 中间的那个数字(例如 %2d%5d)代表最小输出宽度(Minimum Field Width)

简单来说,就是“给这个数字预留几个坑位”

具体规则如下,分两种情况:

1. 数字长度 < 设定宽度(补空格)

如果实际数字的位数少于你设定的宽度,C 语言会在左边补空格,让它凑够宽度(默认右对齐)。

  • 例子printf("start%5dend", 123);
  • 数字123(3 位)
  • 设定%5d(5 位)
  • 结果start 123end (注意 123 前面有两个空格,凑成了 5 位)

2. 数字长度 ≥ 设定宽度(按原样输出)

这是新手最容易误解的地方:如果实际数字的位数多于等于你设定的宽度,C 语言不会截断数据,而是自动突破限制,完整打印出所有数字。

  • 例子printf("start%2dend", 12345);
  • 数字12345(5 位)
  • 设定%2d(2 位)
  • 结果start12345end (为了保证数据正确,宽度限制失效,完整输出)

拓展知识

  1. **补零 (%02d)**:
    • 如果你想显示时间 5:05 而不是 5: 5,就要用 %02d
    • 含义:宽度为 2,不足的前面补 0,而不是补空格。
    • printf("%02d", 5); -> 输出 05
  2. **左对齐 (%-5d)**:
    • 加一个负号,表示左对齐
    • printf("start%-5dend", 123); -> 输出 start123 end(空格补在后面)。

二、输出浮点数时

对于小数(浮点数),我们通常使用 %f,但当且仅当中间出现数字时,它的格式通常是这样的:

%m.nf

这里有两个数字,中间用点隔开(比如 %6.2f)。我们要把它们拆开来看,顺序很重要


1. 先看后面的 .n(精度控制)

这是最重要的部分!它决定了小数点后面保留几位

  • 如果实际小数位数多了,它会四舍五入(准确说是按舍入规则处理,考试通常视为四舍五入)。
  • 如果实际小数位数少了,它会补 0

例子x = 3.14159;

  • %.2f -> 保留 2 位 -> 输出 3.14
  • %.4f -> 保留 4 位 -> 输出 3.1416 (注意进位了!)
  • %.0f -> 不保留小数 -> 输出 3

2. 再看前面的 m(总宽度)

处理完小数位数后,再看总长度。这里的坑最大!

m 代表的是整个数字输出的总长度,它包含三部分:

  1. 整数部分
  2. 小数点本身(是的,小数点 . 也要占 1 个格子!)
  3. 小数部分

规则和整数一样:

  • 如果 处理后的数字长度 < m:左边补空格
  • 如果 处理后的数字长度 ≥ m:忽略 m,完整输出

格式化输出大全

printf 的格式控制符其实有一套严密的通用公式。一旦看懂这个公式,任何复杂的格式能一眼看穿。


1. 终极公式 (The Ultimate Formula)

每一个 % 后面,其实都隐藏着 5 个部分的组合:

$$% \ [标志] \ [最小宽度] \ [.精度] \ [长度修饰符] \ [转换类型]$$

我们从后往前(从最核心的到修饰性的)一个一个讲。


2. [转换类型] (Specifier) —— 核心灵魂

这是必选项,决定了数据以什么本质显示。

类型 含义 举例
d 有符号十进制整数 102
u 无符号十进制整数 102
f 浮点数 (默认6位小数) 12.345000
c 单个字符 'a'
s 字符串 "Hello"
x / X 十六进制整数 1a / 1A
o 八进制整数 12
p 指针地址 0x7ffee
% 输出百分号本身 %

3. [最小宽度] & [.精度] —— 塑形

这两者决定了数据的长短细节

  • **宽度 (width)**:

    • 数字 m

    • 如果数据短,补空格(默认补在左边)。

    • 如果数据长,直接撑开,不会截断。

    • 动态宽度:可以用 * 代替数字,从参数里读取。

      1
      printf("%*d", 5, 10); // 等同于 "%5d",输出 "   10"
  • **精度 (.precision)**:

    • 格式是 .n
    • **对浮点数 (%f)**:保留 $n$ 位小数(四舍五入)。
    • 对字符串 (%s)截断!只输出前 $n$ 个字符。
      • printf("%.3s", "Hello"); -> 输出 "Hel"
    • 对整数 (%d)补零!保证至少输出 $n$ 位数字(类似 %02d 的效果,但优先级更高)。
      • printf("%.5d", 10); -> 输出 "00010"

4. [标志] (Flags) —— 风格修饰

这是用来调整对齐和填充方式的,放在 % 紧后面。

标志 含义 例子 (针对数字 10) 解释
- 左对齐 (默认是右对齐) %-5d -> "10 " 做表格必备,保证文字靠左
0 补零 (代替空格) %05d -> "00010" 时间/日期必备 (08:05)
+ 强制显示正负号 %+d -> "+10" 显示温差、电压变化量
空格 正数前留个空格,负数显示负号 % d -> " 10" 为了正负数对齐好看
# 自动加前缀 %#x -> "0xa" 16进制神器,自动加上 0x,防歧义

【C语言】格式化输出
http://example.com/2026/01/13/格式化输出/
作者
王柏森
发布于
2026年1月13日
许可协议