std::setw仅对紧随其后的单个输出项生效,需配合std::left/right/internal指定对齐方式,并常与std::setfill联用控制填充字符;其效果不持续,且当内容长度≥设定宽度时无效。
用 std::setw 控制字段宽度,但必须配合 std::left/std::right/std::internal
std::setw 本身不改变对齐,只设置下一次输出操作的最小字段宽度。它像一个“一次性开关”,只对紧随其后的那个 生效,之后立即失效。
常见错误是只写 std::setw(10) 就以为能左对齐或居中——实际默认是右对齐,且没指定对齐标志时,setw 的效果可能被忽略(比如输出内容比宽度长)。
- 必须搭配
std::left(左对齐)、std::right(右对齐,默认)、std::internal(符号/前缀左、数值右)才能生效 - 每次需要对齐都要重新写
std::setw(n),它不具有“持续作用” - 如果输出内容长度 ≥
setw设置的值,对齐无效,直接原样输出(不截断)
std::setw 和 std::setfill 要成对使用才好看
默认填充字符是空格,但一旦你希望用 '*'、'0' 或其他字符补位,就得用 std::setfill 显式设定。注意:setfill 是“持久”的,设一次会影响后续所有带宽度的输出,直到再次修改。
示例:
立即学习“C++免费学习笔记(深入)”;
#include
#include
int main() {
std::cout << std::left << std::setw(8) << std::setfill('*') << "abc" << "\n";
std::cout << std::right << std::setw(8) << "def" << "\n"; // 这里仍用 '*' 填充!
}
输出: