29

我想到的第一件事是做一堆 \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

我还需要做什么?

编辑:所以我知道我应该首先计算我想要显示的每一列的最大宽度,然后相应地添加填充空间。但是,我可以如何以及使用哪些功能来执行此操作?我应该简单地计算字符串中的字符数然后从那里开始吗?

4

5 回答 5

35

使用std::setw<iomanip>

例如

using std::cout;
using std::setw;

cout << setw(10) << "This" <<
        setw(10) << "is" <<
        setw(10) << "a" <<
        setw(10) << "test" << '\n';

输出:

      This        is         a      test
于 2010-03-12T21:38:22.290 回答
8

使用带有减号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
于 2010-03-12T21:29:28.653 回答
7

您还应该考虑到不同的编辑器/查看器显示具有不同选项卡宽度的文本。因此,使用选项卡,在一个查看器中看起来排列良好的文本在另一个查看器中可能看起来很难看。

如果你真的想产生很好的排列,你可以使用填充空间,你可以对你的文本做两次传递:首先计算每列的最大宽度,然后在每列中添加适量的填充空间。对于后者,您还可以使用量身定制的printf电话。

更新:计算列宽基本上意味着计算给定列中字符串的长度。可以使用string::length()or来完成strlen(),具体取决于您是否使用std::stringor char*(推荐使用前者)。然后您只需遍历该列中的所有单词,比较到目前为止的最大单词长度,如果当前单词较长,则将该长度设置为新的最大值。如果您将单词存储在 STL 容器中,您甚至可以使用该std::max_element算法通过单个函数调用为您完成这项工作。

于 2010-03-12T21:29:24.190 回答
2

对于这种情况,通常需要两次通过:一次发现每列的最大宽度,另一次进行打印。对于标准 iostream,您可以使用width()例程让 iostream 自动为您处理填充。

于 2010-03-12T21:30:58.560 回答
0

使用字符串格式(来自 stdio)来显示每一行。

http://www.cppreference.com/wiki/c/io/printf

它可以让您设置最小字段宽度,因此它将为您填充每个字段的其余部分。

于 2010-03-12T21:35:53.800 回答