如何对齐输出?

How to align output?

本文关键字:输出 对齐 何对齐      更新时间:2023-10-16

如何对齐输出?

我试过这个

for(int x = 0; i<5; i++)
cout<<a[x]<<setw(5)<<"|"<<setw(5)<<b[x]<<endl;

如果所有字符都具有相同的字符长度,则输出如下所示

frd     |     hehe
asd   |     hoho
.....
.....

但如果不是有相同的长度

frd     |     hehe
asdfg     |     hohoo

如何解决这个问题?

在建议的代码中:

cout<<a[x]<<setw(5)<<"|"<<setw(5)<<b[x]<<endl;

您有两个问题会导致错位。(1)您没有为a[x]提供任何宽度,因此无需任何调整即可输出;(2) 根据您寻求的对齐方式,为std::cout指定宽度时的默认对齐方式将right对齐。

(此外,正如我的评论中所述,在您的第一个示例中,a[0]a[1]不能具有与示例建议的相同的长度。"frd "与附加whitespace一起存储(或"asdb"与嵌入式backspace一起存储),否则"a[x]|"的输出将对齐。

要为ab的输出提供对齐方式,必须至少指定a[x]的宽度和std::setw(n)。此外,除非您希望a[x]对齐std::setw(5)创建的字段的右侧,否则您必须通过设置 std::ios_base::fmtflags 来控制对齐std::setiosflags(std::ios_base::left)(或简称std::left)。参见 std::setiosflags。

为流设置格式标志时,您将在位图类型中设置,该位将在当前对std::cout调用完成后保持设置状态。因此,要整理自己并将流的标志状态恢复为默认值,您要么 (1) 必须通过捕获所有带有std::ios_base::fmtflags标志来保存流的fmtflags,要么 (2) 您必须重置您使用std::resetiosflags(...)设置的单个标志。

因此,如果我理解您的问题和对齐请求(尽管不清楚您希望如何对齐b[x]),您可以通过以下方式对齐左对齐ab

std::cout << "left justified output (both a & b)nn";
for (size_t i = 0; i < a.size(); i++)
std::cout << std::left  << std::setw(5) 
<< a[i] << " | " << b[i] << 'n';

或者,您可以将a与左对齐对齐,然后恢复默认标志状态,让b以默认(右)对齐对齐,例如

std::cout << "nleft justified output for a, default for bnn";
for (size_t i = 0; i < a.size(); i++)
std::cout << std::left  << std::setw(5) 
<< a[i] << " | " << std::resetiosflags(std::ios_base::left) 
<< std::setw(5) << b[i] << 'n';

把它放在一个例子中,你可以做到:

#include <iostream>
#include <iomanip>
#include <vector>
#include <string>
int main (void) {
std::vector<std::string> a = { "frd", "asdfg", "asd", "quack" }, 
b = { "hehe", "hohoo", "haloo", "hack" };
std::cout << "left justified output (both a & b)nn";
for (size_t i = 0; i < a.size(); i++)
std::cout << std::left  << std::setw(5) 
<< a[i] << " | " << b[i] << 'n';
std::cout << "nleft justified output for a, default for bnn";
for (size_t i = 0; i < a.size(); i++)
std::cout << std::left  << std::setw(5) 
<< a[i] << " | " << std::resetiosflags(std::ios_base::left) 
<< std::setw(5) << b[i] << 'n';
}

示例使用/输出

$ ./bin/setwstring
left justified output (both a & b)
frd   | hehe
asdfg | hohoo
asd   | haloo
quack | hack
left justified output for a, default for b
frd   |  hehe
asdfg | hohoo
asd   | haloo
quack |  hack

: 如果要在输出操作过程中对标志进行多次更改,然后将所有格式标志恢复到其原始状态,则可以使用:

std::ios_base::fmtflags f = std::cout.flags (); // save ios_base flags
// do output, set flags as desired
std::cout.flags (f);                            // restore saved flags

让我知道这是否解决了您试图实现的一致性。

您可以使用所需的任何数字更改 setw(#)。

#include<iostream>
#include<iomanip>
#include<string>
using namespace std;
int main()
{
string a[5] = {"afdfadsf","ggrggeee","fdsafsda","erererefdsfd","sdfdsfdffdf"};
string b[5] = {"fdsfdsfd", "fdsfdsaffdf","fdsfsadfdfd","rererrefdfd","zzzzzzzfdfd"};
for(int i = 0; i<5; i++)
cout << left << setw(15) << a[i] << left << setw(15) << b[i] <<  endl;
}

尝试使用 printf。说真的,它有效。

例如:

#include <cstdio>
int main() {
printf("%-10s | %10sn", "asd", "asdad");
printf("%-10s | %10sn", "asd", "adad");
printf("%-10s | %10sn", "adsada", "adad");
printf("%-10s | %10sn", "addasda", "adad");
printf("%-10s | %10sn", "asdsd", "dad");
printf("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxn", "asdsd", "dad");
printf("%-10s | %-10sn", "asd", "asdad");
printf("%-10s | %-10sn", "asd", "adad");
printf("%-10s | %-10sn", "adsada", "adad");
printf("%-10s | %-10sn", "addasda", "adad");
printf("%-10s | %-10sn", "asdsd", "dad");
}

asd        |      asdad
asd        |       adad
adsada     |       adad
addasda    |       adad
asdsd      |        dad
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
asd        | asdad     
asd        | adad      
adsada     | adad      
addasda    | adad      
asdsd      | dad