左右对齐 格式化输出
正在加载视频播放器…
GESP C++ 一级:左右对齐(格式化输出)
格式化输出中的左右对齐。
核心目标:会用printf的宽度和-标志控制左右对齐,会用cout的setw、left、right控制对齐,能判断输出结果中的空格数量。
默认右对齐,加-变左对齐;宽度是最小宽度,不够补空格,超了不截断。
一、什么是对齐
输出时,经常需要让内容对齐,比如:
姓名 分数
张三 90
李四 85
- “姓名”左对齐,后面补空格。
- “分数”右对齐,前面补空格。
这就是左右对齐。
一级常见用途:
- 输出表格
- 输出成绩单
- 输出乘法表
- 阅读程序写结果时判断空格数量
二、printf 的左右对齐
1. 格式控制符结构
%[标志][宽度][.精度]类型
其中:
| 部分 | 作用 | 示例 |
|---|---|---|
| 标志 | - 表示左对齐,0 表示零填充 |
-、0 |
| 宽度 | 最少占几个字符 | 5、8 |
| 精度 | 小数位数 | .2 |
| 类型 | d、f、c、s |
d、f |
2. 默认右对齐
printf("%5d\n", 123);
输出:
123
123 占 3 位,宽度 5,左边补 2 个空格,右对齐。
3. 左对齐:加 -
printf("%-5d\n", 123);
输出:
123
123 占 3 位,宽度 5,右边补 2 个空格,左对齐。
4. 零填充
printf("%05d\n", 123);
输出:
00123
0 表示用 0 填充,默认右对齐。
5. 宽度是最小宽度
如果内容比宽度长,按实际长度输出,不截断。
printf("%3d\n", 12345);
输出:
12345
宽度 3 小于实际长度 5,所以原样输出。
三、printf 常用对齐示例
1. 整数对齐
printf("%5d|\n", 12);
printf("%-5d|\n", 12);
printf("%05d|\n", 12);
输出:
12|
12 |
00012|
2. 浮点数对齐
printf("%8.2f|\n", 3.14);
printf("%-8.2f|\n", 3.14);
输出:
3.14|
3.14 |
说明:
%8.2f:总宽度 8,保留 2 位小数,右对齐。%-8.2f:总宽度 8,保留 2 位小数,左对齐。
3. 字符和字符串对齐
printf("%5c|\n", 'A');
printf("%-5c|\n", 'A');
printf("%6s|\n", "Hi");
printf("%-6s|\n", "Hi");
输出:
A|
A |
Hi|
Hi |
4. 表格输出
printf("%-10s%5s\n", "姓名", "分数");
printf("%-10s%5d\n", "张三", 90);
printf("%-10s%5d\n", "李四", 85);
输出:
姓名 分数
张三 90
李四 85
%-10s:姓名左对齐,占 10 个字符宽。%5d:分数右对齐,占 5 个字符宽。
四、cout 的左右对齐
使用 cout 做对齐,需要头文件:
#include <iomanip>
常用操纵器:
| 操纵器 | 作用 |
|---|---|
setw(n) |
设置下一个输出项的宽度 |
left |
左对齐 |
right |
右对齐(默认) |
setfill(c) |
设置填充字符 |
1. 右对齐
cout << right << setw(5) << 123 << endl;
输出:
123
2. 左对齐
cout << left << setw(5) << 123 << endl;
输出:
123
3. 零填充
cout << setfill('0') << right << setw(5) << 123 << endl;
输出:
00123
注意:setfill 会持续影响后面的输出,用完可以恢复:
cout << setfill(' ');
4. setw 只影响下一个输出项
cout << setw(5) << 123 << 456 << endl;
输出:
123456
setw(5) 只作用于 123,456 没有宽度设置。
如果两个都要对齐:
cout << setw(5) << 123 << setw(5) << 456 << endl;
输出:
123 456
5. left 和 right 会持续生效
cout << left << setw(5) << 123 << setw(5) << 456 << endl;
输出:
123 456
因为 left 一直有效。
五、printf 与 cout 对齐对照
| 需求 | printf |
cout |
|---|---|---|
| 右对齐,宽度 5 | printf("%5d", a); |
cout << right << setw(5) << a; |
| 左对齐,宽度 5 | printf("%-5d", a); |
cout << left << setw(5) << a; |
| 零填充,宽度 5 | printf("%05d", a); |
cout << setfill('0') << right << setw(5) << a; |
| 浮点右对齐,宽度 8,2 位小数 | printf("%8.2f", x); |
cout << fixed << setprecision(2) << setw(8) << x; |
| 浮点左对齐,宽度 8,2 位小数 | printf("%-8.2f", x); |
cout << fixed << setprecision(2) << left << setw(8) << x; |
| 字符串左对齐,宽度 10 | printf("%-10s", s); |
cout << left << setw(10) << s; |
六、易错点
-
-位置写错printf("%5-d", a); // 错误 printf("%-5d", a); // 正确 -
默认右对齐,忘记加
-导致左对齐失败printf("%5d", 123); // 右对齐,输出 " 123" printf("%-5d", 123); // 左对齐,输出 "123 " -
宽度是最小宽度,不会截断
printf("%3d", 12345); // 输出 12345 -
左对齐时补空格在右边,右对齐时补空格在左边
%5d:左边补空格。%-5d:右边补空格。
-
%05d和%-同时用,0 填充可能失效printf("%-05d", 123); // 一般按左对齐空格填充处理 -
cout忘记#include <iomanip>
使用setw、left、right、setfill必须包含。 -
cout的setw只影响下一个输出项cout << setw(5) << a << b; // b 不受宽度影响 -
left、right、setfill会持续生效
注意及时切换或恢复。 -
printf中输出%要写%%printf("100%%\n"); // 输出 100% -
空格数量数错
阅读程序写结果时,一定要数清补了几个空格。
七、阅读程序写结果
题目 1
printf("%5d|\n", 12);
输出:
12|
题目 2
printf("%-5d|\n", 12);
输出:
12 |
题目 3
printf("%05d|\n", 12);
输出:
00012|
题目 4
printf("%8.2f|\n", 3.14);
输出:
3.14|
题目 5
printf("%-8.2f|\n", 3.14);
输出:
3.14 |
题目 6
printf("%6s|\n", "Hi");
输出:
Hi|
题目 7
printf("%-6s|\n", "Hi");
输出:
Hi |
题目 8
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
cout << right << setw(5) << 123 << endl;
cout << left << setw(5) << 123 << endl;
return 0;
}
输出:
123
123
题目 9
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
cout << setfill('0') << right << setw(5) << 12 << endl;
return 0;
}
输出:
00012
题目 10
printf("%-5s%5d\n", "A", 90);
输出:
A 90
解释:A 左对齐占 5 位,输出 A ;90 右对齐占 5 位,输出 90。合起来:
A 90
八、速查表
| 需求 | printf 写法 |
输出示例 |
|---|---|---|
| 右对齐整数,宽 5 | printf("%5d", 123); |
123 |
| 左对齐整数,宽 5 | printf("%-5d", 123); |
123 |
| 零填充整数,宽 5 | printf("%05d", 123); |
00123 |
| 右对齐浮点,宽 8,2 位小数 | printf("%8.2f", 3.14); |
3.14 |
| 左对齐浮点,宽 8,2 位小数 | printf("%-8.2f", 3.14); |
3.14 |
| 右对齐字符串,宽 6 | printf("%6s", "Hi"); |
Hi |
| 左对齐字符串,宽 6 | printf("%-6s", "Hi"); |
Hi |
cout 右对齐 |
cout << right << setw(5) << 123; |
123 |
cout 左对齐 |
cout << left << setw(5) << 123; |
123 |
cout 零填充 |
cout << setfill('0') << right << setw(5) << 123; |
00123 |
九、总结
左右对齐是格式化输出的重要内容。
printf默认右对齐,加-变左对齐。- 宽度写在
%和类型之间,如%5d、%-5d。 0表示零填充,如%05d。- 宽度是最小宽度,内容超长不截断。
cout用setw设置宽度,left、right控制对齐,setfill设置填充。setw只影响下一个输出项,left/right/setfill会持续生效。
复习时多练“阅读程序写结果”中的空格数量,重点注意 - 的位置、宽度、零填充、浮点小数位和 cout 的 setw 一次性。考试中先看格式符,再数宽度,最后逐字符写出输出。