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

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::string或const char*的内容,只影响字段不足时的补位
左对齐、右对齐、居中?只有左右,居中得手写
std::left 和 std::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 - 混用
left和right时,注意它们影响的是后续所有带setw的输出,不是单次
输出浮点数对齐要注意精度干扰字段宽度
对浮点数用 setw 时,实际占位宽度包含小数点、指数符号、负号等。比如 setw(6) ,输出是 " 12.34"(6 字符),但 setw(6) 会变成 "123.456"(7 字符)—— 因为默认精度 6 导致多了一位。
- 先用
setprecision固定小数位数,再用setw,否则字段宽度不可控 -
fixed和scientific会影响总长度,123.456在fixed下是"123.456",在scientific下是"1.23456e+02" - 安全做法:对浮点输出统一用
fixed
真正麻烦的不是怎么写,而是忘记 setw 只作用一次,或者在循环里漏掉 setfill(' ') 导致后面所有输出都被星号塞满。这种问题往往要花三分钟看输出、两分钟翻文档、三十秒改代码。










