如何正确组织输出到列?

时间:2010-03-12 21:26:22

标签: c++ tabs indentation cout

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

我还需要做什么?

编辑:所以我知道我应该首先计算我想要显示的每列的最大宽度,然后相应地添加填充空格。但是我可以如何以及通过什么功能来做这件事呢?我应该只计算一个字符串中的字符数,然后从那里开始?

5 个答案:

答案 0 :(得分:30)

使用<iomanip>

中的std::setw

e.g。

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

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

输出:

      This        is         a      test

答案 1 :(得分:7)

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

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

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

答案 2 :(得分:6)

使用printf()填充 minas 标记进行左对齐

 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

答案 3 :(得分:2)

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

答案 4 :(得分:0)

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

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

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