首页 > 编程语言 >C++之setw

C++之setw

时间:2024-11-08 22:42:43浏览次数:1  
标签:输出 填充 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

标签:输出,填充,C++,setw,空格,宽度,对齐
From: https://www.cnblogs.com/hisun9/p/18536061

相关文章

  • C++之endl以及它与换行符的区别
    看下C++_primer上的一段话,并给予解释:1.endl是操纵符在C++中,endl是一种特殊的操纵符(manipulator),它的作用不仅是结束一行(相当于换行),还会刷新缓冲区。操纵符是一种可以影响输出行为的特殊值,比如endl、setw等。题外话想要了解更多关于setw的内容,可以看下这篇博客C++之set......
  • C++中类和结构体的互相继承
    在C++中,struct可以继承类,反之,类也可以继承struct。struct和类的唯一区别在于访问级别,默认情况下,struct的成员是public,而类的成员是private。以下是一个简单的例子:classBaseClass{public:voidBaseFunction(){std::cout<<"FunctioninBaseClass"<<std::endl;......
  • C++之fixed
    在C++中,fixed是一个操纵符(manipulator),用于指定浮点数的显示格式。在默认情况下,C++会使用科学计数法或定点(小数点)格式输出浮点数,具体取决于数值的大小和有效位数。然而,当使用fixed时,它会强制所有浮点数都以定点格式显示,即以小数点后的固定位数输出,不使用科学计数法。fixed......
  • C++模板真的没有教材讲的呢么简单
            模板和泛型编程息息相关,但是大多数人对模板的了解可能只是教材上的一个compare函数,但实际上模板的内容很丰富,学起来也比较抽象,我会结合我所了解的一部分模板内容进行解释。    本文内容参考《C++Primer》目录定义模板模板实参推演可变参数模板......
  • C++——求a!+b!+c!的值,用一个函数fac(n)求n!。a,b,c的值由主函数输入,最终得到的值在主
    没注释的源代码#include<iostream>usingnamespacestd;intfun(intn);intmain(){   inta,b,c,sum;   cout<<"pleaseinputa,b,c:";   cin>>a>>b>>c;   sum=fun(a)+fun(b)+fun(c);   cout<<"a!+b!+c!="......
  • C++——求一个3*3矩阵主对角线元素之和。
    没注释的源代码#include<iostream>usingnamespacestd;intmain(){   inta[3][3],sum=0;   cout<<"pleaseinputmartix:"<<endl;   for(inti=0;i<3;i++)   {       for(intj=0;j<3;j++)       {           cin......
  • C++——分别声明Teacher(教师)类和Cadre(干部)类,采用多重继承方式由这两个类派生出新
    要求:(1)在两个基类中都包含姓名年龄性别地址电话等数据成员。(2)在Teacher类中还包含数据成员tile职称),在Cadre类中还包含数据成员POst(职务)。在Teacher.Cadre类中还包含数据成员wages(工资)。(3)对两个基类中的姓名、年龄、性别、地址、电话等数据成员用相同的名字,在......
  • C++ 函数对象、函数指针与Lambda表达式
    C++函数对象、函数指针与Lambda表达式函数指针函数指针(FunctionPointer)是指向函数的指针变量。它可以存储函数的地址,并通过该指针变量来调用该函数。函数指针的声明使用指针符号,指向的类型为函数的返回类型和参数列表,如int(funcPtr)(int,int);。函数指针的值可以指向相同......
  • 08C++选择结构(2)——教学
    一、逻辑变量教学视频存储类似灯亮或灯灭、是男还是女等结果只有两种可能的数据时,可以使用逻辑型变量。逻辑型变量用关键字bool定义,所以又称为布尔变量,其值只有两个false(假)和true(真),false和true是逻辑常量,又称布尔常量。流程图如下:英汉小词典:bool:布尔false:假true:真二、逻......
  • C++ 可变参数模板递归展开
    #include<iostream>usingnamespacestd;template<typenameHead,typename...Tail>doubleMax(Headfirst,Tail...rest){doubleMaxnum=0;Maxnum=Max(rest...);if(Maxnum<first)Maxnum=first;returnMaxnum;}......