左右对齐 格式化输出

正在加载视频播放器…

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;

六、易错点

  1. - 位置写错

    printf("%5-d", a);   // 错误
    printf("%-5d", a);   // 正确
    
  2. 默认右对齐,忘记加 - 导致左对齐失败

    printf("%5d", 123);   // 右对齐,输出 "  123"
    printf("%-5d", 123);  // 左对齐,输出 "123  "
    
  3. 宽度是最小宽度,不会截断

    printf("%3d", 12345);  // 输出 12345
    
  4. 左对齐时补空格在右边,右对齐时补空格在左边

    • %5d:左边补空格。
    • %-5d:右边补空格。
  5. %05d 和 %- 同时用,0 填充可能失效

    printf("%-05d", 123);  // 一般按左对齐空格填充处理
    
  6. cout 忘记 #include <iomanip>
    使用 setw、left、right、setfill 必须包含。

  7. cout 的 setw 只影响下一个输出项

    cout << setw(5) << a << b;  // b 不受宽度影响
    
  8. left、right、setfill 会持续生效
    注意及时切换或恢复。

  9. printf 中输出 % 要写 %%

    printf("100%%\n");  // 输出 100%
    
  10. 空格数量数错
    阅读程序写结果时,一定要数清补了几个空格。


七、阅读程序写结果

题目 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

九、总结

左右对齐是格式化输出的重要内容。

  1. printf 默认右对齐,加 - 变左对齐。
  2. 宽度写在 % 和类型之间,如 %5d、%-5d。
  3. 0 表示零填充,如 %05d。
  4. 宽度是最小宽度,内容超长不截断。
  5. cout 用 setw 设置宽度,left、right 控制对齐,setfill 设置填充。
  6. setw 只影响下一个输出项,left/right/setfill 会持续生效。

复习时多练“阅读程序写结果”中的空格数量,重点注意 - 的位置、宽度、零填充、浮点小数位和 cout 的 setw 一次性。考试中先看格式符,再数宽度,最后逐字符写出输出。