如何对齐输出?
How to align output?
如何对齐输出?
我试过这个
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]|"
的输出将对齐。
要为a
和b
的输出提供对齐方式,必须至少指定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]
),您可以通过以下方式对齐左对齐a
和b
:
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
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 如何创建一个QTableWidgetItem,用长文本右对齐,左边有省略号
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?
- 64位机器上的C++内存对齐
- C++ cout 对齐输出数字
- cout 不能一致地打印字符串和变量值,导致输出未对齐
- 如何对齐输出?
- 在输出输入文本时对齐输入的文本
- 背诵和提示输出对齐C++,输出格式
- C 输出中的总右对齐
- 将输出文本与 cout 对齐到右侧
- C++输出对齐和小数位数保持器
- 如何对齐来自数组的不同长度的输出
- 如何对齐不同长度的输出C++
- 如何将输出对齐到屏幕的中心- c++
- Fstream和setw没有正确对齐输出
- c++:右对齐的字段输出
- 在c++中对齐(格式化)输出//多个变量在一行中
- 为什么clang输出对齐特定的东西
- 在c++中对齐右侧的输出