C++之setw
1. 什么是 setw
setw 是 C++ 中一个用于控制输出宽度的操纵符(manipulator),它定义在 <iomanip>
头文件中。通过 setw 可以指定下一个输出项应占用的字符宽度,在格式化输出时非常有用。
2. setw 的作用
setw(n)
设置的宽度 n 表示下一个要输出的项所占的最小宽度。如果输出项的实际字符数少于 n,系统会在左侧自动填充空格,确保输出项的宽度达到 n。如果输出项的字符数多于 n,则宽度会自动扩展,不会截断内容。
3. setw 的用法
为了使用 setw,需要包含 <iomanip>
头文件。
setw 的典型使用方式是 std::setw(n)
,其中 n 是设置的宽度。
比如:
#include <iostream>
#include <iomanip> // 包含 iomanip 头文件以使用 setw
using namespace std;
int main() {
cout << setw(10) << 123 << endl; // 输出宽度为 10,数字靠右对齐
cout << setw(10) << "hello" << endl; // 输出宽度为 10,字符串靠右对齐
cout << setw(10) << 45.67 << endl; // 输出宽度为 10,浮点数靠右对齐
return 0;
}
输出如下:
在这个例子中,setw(10)
指定宽度为 10,因此每个输出项在 10 个字符宽度内显示,不足的部分会填充空格,以确保每项内容对齐。
4. setw 的特点
-
只对下一个输出项生效:setw 只影响紧接在它后面的一个输出项。因此,如果想对多个输出项设置宽度,需要在每个输出项前重复使用 setw。
-
自动填充空格:当输出项的实际宽度小于指定的宽度时,setw 会在左侧自动填充空格,使内容右对齐(默认情况下)。
-
不会截断内容:如果输出项的实际宽度大于指定的宽度,则 setw 不会截断内容,输出项会按原始宽度显示,忽略 setw 的设置。
5. 使用 setw 格式化表格输出
setw 通常用于格式化表格数据输出,以便在控制台上实现对齐效果。
比如:
#include <iostream>
#include <iomanip> // 包含 iomanip 头文件
using namespace std;
int main() {
// 表头
cout << setw(10) << "Name" << setw(5) << "Age" << setw(15) << "City" << endl;
// 数据行
cout << setw(10) << "Alice" << setw(5) << 23 << setw(15) << "New York" << endl;
cout << setw(10) << "Bob" << setw(5) << 30 << setw(15) << "Los Angeles" << endl;
cout << setw(10) << "Charlie" << setw(5) << 28 << setw(15) << "Chicago" << endl;
return 0;
}
输出如下:
这里使用 setw 设置了每列的宽度,使得数据在表格中整齐对齐。每列的宽度是根据数据内容的大小合理选择的,比如 Name 列宽度为 10,而 Age 列宽度为 5。
6. setw 的工作原理
缓存和一次性应用
-
setw 是一个一次性应用的操纵符,它仅对紧随其后的输出操作生效。例如,
cout << setw(10) << "Alice" << "Bob"
; 中,setw(10)
只会影响 "Alice" 的输出,而不会影响 "Bob" 的输出。因此,如果想对多个输出项设置相同宽度,必须在每个输出项前都使用 setw。 -
使用 setw 设置宽度时,
ostream
会将宽度缓存到一个内部变量中,等到执行下一个输出操作时才会使用,然后立即将缓存的宽度重置为默认状态(通常为 0)。这就是为什么 setw 是一次性操作的原因。
默认填充字符为空格
setw 默认会在宽度不足的情况下在左侧填充空格,以实现右对齐。如果想更改填充字符,可以使用 setfill
操纵符。
比如:
cout << setfill('-') << setw(10) << 123 << endl;
这段代码会在左侧填充 -,而不是空格。
setw 与其他操纵符的配合使用
可以将 setw 与其他操纵符(如 left
、right
)配合使用,以控制数据的对齐方式。
比如:
cout << left << setw(10) << "Alice" << right << setw(5) << 23 << endl;
-
left 将数据左对齐,右侧填充空格。
-
right 将数据右对齐,左侧填充空格(默认行为)。
结合 setw 和 fixed 控制浮点数格式
当输出浮点数时,可以配合 fixed
和 setprecision
控制小数位数。
比如:
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
cout << fixed << setprecision(2) << setw(10) << 123.456 << endl; // 输出: 123.46
return 0;
}
输出如下:
这里,fixed
会固定输出小数格式,而 setprecision(2)
会将浮点数保留两位小数,setw(10)
控制总宽度。
想了解更多关于fixed
的内容,可以看下这篇博客 C++之fixed