C++ 怎么输出对齐 C++ setw与setfill格式控制【排版】

2次阅读

setw仅对下一个输出项生效,需每次重新调用;它来自,行为类似C的printf(“%10d”,x),但易误以为设一次即全局生效。

C++ 怎么输出对齐 C++ setw与setfill格式控制【排版】

setw 控制字段宽度但不保留,每次都要重新写

setw 里的操纵符,只对紧跟着的下一个输出项生效,不会持续影响后续输出。这点和 C 的 printf("%10d", x) 行为类似,但容易误以为设一次就全局生效。

常见错误是这样写:

cout << setw(5) << 123 << " " << 456;

结果是 " 123 456" —— 只有 123 被填充了 2 个空格,456 完全没对齐。因为 setw(5) 不改变流状态,也不“记住”宽度。

  • 每次需要对齐的输出前都得显式加 setw(N)
  • 它不改变已有填充字符,默认是空格
  • 如果想对齐多列数字,必须为每一列单独配 setw

setfill 配合 setw 才能换填充字符

默认用空格填充,但有时要对齐时用 '0'(如打印编号 0001)或 '*'(调试分隔),就得用 setfill

立即学习C++免费学习笔记(深入)”;

setfill 是持久的:一旦设置,会一直生效直到再次调用 setfill 改变它。所以通常和 setw 成对出现:

cout << setfill('0') << setw(4) << 7 << " " << setw(4) << 123;

输出:"0007 0123"。注意第二个 setw(4) 仍使用 '0' 填充,因为 setfill 没被重置。

  • 用完记得恢复空格填充(setfill(' ')),尤其在函数内或循环
  • setfill 参数只能是 char,不能传字符串或宽字符
  • 它不影响 std::Stringconst char* 的内容,只影响字段不足时的补位

左对齐、右对齐、居中?只有左右,居中得手写

std::leftstd::right 是流格式标志,配合 setw 控制对齐方向。默认就是 right,所以通常不用显式写。

cout << left << setw(8) << "abc" << right << setw(8) << 42;

输出:"abc 42 "(前者左对齐,后者右对齐)。

  • left/right 是流状态,会持续生效,不像 setw
  • c++ 标准库没有 std::center,真要居中得自己算空格数:int pad = (width - str.Length()) / 2; 然后前后分别 cout
  • 混用 leftright 时,注意它们影响的是后续所有带 setw 的输出,不是单次

输出浮点数对齐要注意精度干扰字段宽度

对浮点数用 setw 时,实际占位宽度包含小数点、指数符号、负号等。比如 setw(6) ,输出是 " 12.34"(6 字符),但 setw(6) 会变成 "123.456"(7 字符)—— 因为默认精度 6 导致多了一位。

  • 先用 setprecision 固定小数位数,再用 setw,否则字段宽度不可控
  • fixedscientific 会影响总长度,123.456fixed 下是 "123.456",在 scientific 下是 "1.23456e+02"
  • 安全做法:对浮点输出统一用 fixed

真正麻烦的不是怎么写,而是忘记 setw 只作用一次,或者在循环里漏掉 setfill(' ') 导致后面所有输出都被星号塞满。这种问题往往要花三分钟看输出、两分钟翻文档、三十秒改代码。

text=ZqhQzanResources