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;
}

输出如下:

img

在这个例子中,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;
}

输出如下:

img

这里使用 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 与其他操纵符(如 leftright)配合使用,以控制数据的对齐方式。

比如:

cout << left << setw(10) << "Alice" << right << setw(5) << 23 << endl;
  • left 将数据左对齐,右侧填充空格。

  • right 将数据右对齐,左侧填充空格(默认行为)。

结合 setw 和 fixed 控制浮点数格式

当输出浮点数时,可以配合 fixedsetprecision 控制小数位数。

比如:

#include <iostream>
#include <iomanip>
using namespace std;

int main() {
    cout << fixed << setprecision(2) << setw(10) << 123.456 << endl; // 输出:    123.46
    return 0;
}

输出如下:

img

这里,fixed 会固定输出小数格式,而 setprecision(2) 会将浮点数保留两位小数,setw(10) 控制总宽度。

想了解更多关于fixed的内容,可以看下这篇博客 C++之fixed

posted @ 2024-11-08 22:41  hisun9  阅读(14)  评论(0编辑  收藏  举报