【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(为了保证数据正确,宽度限制失效,完整输出)
拓展知识
- **补零 (
%02d)**:- 如果你想显示时间
5:05而不是5: 5,就要用%02d。 - 含义:宽度为 2,不足的前面补 0,而不是补空格。
printf("%02d", 5);-> 输出05。
- 如果你想显示时间
- **左对齐 (
%-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 个格子!) - 小数部分
规则和整数一样:
- 如果 处理后的数字长度 < 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/格式化输出/