如何正确地将输出组织成列?
Posted
技术标签:
【中文标题】如何正确地将输出组织成列?【英文标题】:How do I correctly organize output into columns? 【发布时间】:2010-03-12 21:26:22 【问题描述】:我想到的第一件事是做一堆 \t,但如果任何单词比任何其他单词长几个字符,这会导致单词错位。
例如,我想要这样的东西:
Name Last Name Middle initial
Bob Jones M
Joe ReallyLongLastName T
相反,通过在我的 cout 语句中只包含“\t”,我只能设法得到
Name Last Name Middle initial
Bob Jones M
Joe ReallyLongLastName T
或
Name Last Name Middle initial
Bob Jones M
Joe ReallyLongLastName T
我还需要做什么?
编辑:所以我知道我应该首先计算我想要显示的每一列的最大宽度,然后相应地添加填充空格。但是,我可以如何以及使用哪些功能来执行此操作?我应该简单地计算字符串中的字符数然后从那里开始吗?
【问题讨论】:
【参考方案1】:使用来自<iomanip>
的std::setw
例如
using std::cout;
using std::setw;
cout << setw(10) << "This" <<
setw(10) << "is" <<
setw(10) << "a" <<
setw(10) << "test" << '\n';
输出:
This is a test
【讨论】:
我认为你也应该使用cout << left
感谢您和 Alexandre!我终于得到了我想要的:)【参考方案2】:
使用带有 minus 标志的 printf()
填充进行左对齐
printf("%-8s%-21s%-7s%-6s\n", "Name", "Last Name", "Middle", "initial");
printf("%-8s%-21s%-7s%-6s\n", "Bob", "Jones", "M", "");
printf("%-8s%-21s%-7s%-6s\n", "Joe", "ReallyLongLastName", "T", "");
产生:
Name Last Name Middle initial
Bob Jones M
Joe ReallyLongLastName T
【讨论】:
很公平,但考虑到标签,也许更喜欢 iostream 解决方案。【参考方案3】:您还应该考虑到不同的编辑器/查看器显示具有不同标签宽度的文本。因此,使用选项卡时,在一个查看器中看起来排列良好的文本在另一个查看器中可能看起来很难看。
如果你真的想产生良好的排列,你可以使用填充空间,你可以对你的文本做两次传递:首先计算每列的最大宽度,然后为每列添加适量的填充空间。对于后者,您还可以使用量身定制的printf
呼叫。
更新:计算列宽基本上意味着计算给定列中字符串的长度。可以使用string::length()
或strlen()
来完成,具体取决于您使用的是std::string
还是char*
(推荐使用前者)。然后您只需遍历该列中的所有单词,比较到目前为止的最大单词长度,如果当前单词较长,则将该长度设置为新的最大值。如果您将单词存储在 STL 容器中,您甚至可以使用 std::max_element
algorithm 通过单个函数调用为您完成这项工作。
【讨论】:
谢谢!如何计算每列的最大宽度? 非常感谢!这是一个更加灵活的实现imo:P【参考方案4】:对于这种情况,通常需要两次传递:一次发现每列的最大宽度,另一次进行打印。对于标准 iostream,您可以使用 width()
例程让 iostream 自动为您处理填充。
【讨论】:
【参考方案5】:使用字符串格式(来自 stdio)显示每一行。
http://www.cppreference.com/wiki/c/io/printf
它可以让您设置最小字段宽度,因此它会为您填充每个字段的其余部分。
【讨论】:
以上是关于如何正确地将输出组织成列?的主要内容,如果未能解决你的问题,请参考以下文章