setw / setfill / fixed / setprecision / oct…一页看懂怎么对齐、定宽、留几位小数、换进制。
setw / setfill / left/right/internal 控制输出宽度、填充字符与对齐;fixed + setprecision 让浮点数"保留 n 位小数",用 scientific 输出科学计数法;oct/hex/showbase/boolalpha/showpos 换进制、打 true/false、显示正号,并避开"中文 + setw"的对齐坑。格式控制靠 操纵符(manipulator)——它们被 << 夹在中间,临时改 cout 的输出状态。
想用上面的命令,第一行必须加 #include <iomanip>,否则编译不过。先记一张速查表:
| 需求 | 核心命令(<iomanip>) | 一句话 |
|---|---|---|
| 固定宽度 | setw(n) | 只对下一个输出项生效,之后自动恢复 |
| 填充字符 | setfill(c) | 宽度不够时用什么填,默认空格 |
| 对齐方式 | left / right / internal | 左 / 右(默认)/ 内对齐(符号位) |
| 浮点精度 | setprecision(n)、fixed、scientific | 有效数字 or 小数位数 / 定点 / 科学计数 |
| 进制 | oct / hex / showbase / uppercase | 八 / 十六进制、带前缀、大写 A-F |
| 布尔 / 正号 | boolalpha / showpos | 输出 true/false、正数带 + |
调一个参数,下面这行代码和输出格子立刻变。看清 setw 补了几位、setfill 用什么补、三种对齐怎么摆。
同一个 setprecision(n),在三种模式下含义完全不同。
| 模式 | n 的含义 | 3.1415926535 |
|---|---|---|
setprecision(3)(默认) | 保留 3 位有效数字 | 3.14 |
fixed << setprecision(2) | 保留 2 位小数(定点) | 3.14 |
scientific << setprecision(4) | 科学计数法、4 位小数 | 3.1416e+00 |
点"单步"看这行代码在 fixed 之后怎么一步步被"锁死"。
fixed 是怎么把输出"锁"成定点小数、并一路延续下去的。| 要的效果 | 代码 | 实测输出 |
|---|---|---|
八进制、带前缀 0 | oct << showbase << 255 | 0377 |
| 十六进制、大写 + 前缀 | hex << uppercase << 255 | 0XFF |
| 十六进制默认(小写!) | hex << 255 | ff |
| 布尔输出成 true / false | boolalpha << true | true |
| 正数带 + 号 | showpos << 123 << " " << -456 | +123 -456 |
反着关:noshowbase、noboolalpha、noshowpos 恢复默认。
表头 + 分隔线 + 数据行。要点:left 只设一次、每个字段都要 setw、小数用 fixed << setprecision(2)。
顺带记一下:endl = 换行 + 刷新缓冲区;flush 只刷新不换行;ends 输出空字符 \0(少用)。
setw。实测 setw(8)<<"ab"<<"cd" 输出 [ab cd]——只有 ab 被补宽。setfill('-')<<setw(8)<<"姓名" 只补 2 个短横 --姓名,不是 6 个。要对齐中文,别用 setw。setprecision(6) 是 6 位小数、不是 6 位有效数字。复原要用 cout.unsetf(ios::fixed | ios::scientific)。right、setfill(' ')、noshowbase、noboolalpha、noshowpos。setw、setfill、fixed、setprecision 这些格式控制命令,必须先包含哪个头文件?<iomanip> 里;<iostream> 只提供最基本的 cin/cout。cout << setfill('*') << setw(6) << "ab";,输出是什么?(默认右对齐)****ab。= 补满到 10 位,正确写法是?left,填充在内容右侧,得 abc=======。默认是右对齐(C 会是右边靠左、左边填 =)。3.142(保留 3 位小数),应写?fixed 配合 setprecision(3);光 setprecision(3) 是 3 位有效数字,会输出 3.14。ff(没加 uppercase);setfill('0')<<setw(6) 补成 0000ff;后面 fixed<<setprecision(2) 只作用于浮点数,3.1415926 → 3.14。格式控制就是一门"等宽排版"。等宽字体里 1 个英文字符占 1 列、1 个汉字占 2 列,终端靠"列"对齐——setw 却是按"字符/字节"计数,一个汉字在 UTF-8 下占 3 字节、显示只占 2 列。于是 setw(9) 对齐"数学"(2 汉字 = 6 字节)只补 3 个空格,显示却是 4 列汉字 + 3 空格 = 7 列,离期望的 9 列差 2 列。
可感的数字就在上面:期望 9 列,实际 7 列,错位 2 列。排版工具都要分清"字节 / 字符 / 显示宽度"是三回事。