如何正确组织输出到列?

wro*_*ame 25 c++ tabs cout indentation

我想到的第一件事是做一堆\ t\t,但如果任何单词比任何其他单词长几个字符,那么会导致单词错位.

例如,我希望有类似的东西:

Name    Last Name            Middle initial
Bob     Jones                M
Joe     ReallyLongLastName   T
Run Code Online (Sandbox Code Playgroud)

相反,通过在我的cout语句中仅包含"\ t",我只能设法得到

Name    Last Name            Middle initial
Bob     Jones                M
Joe     ReallyLongLastName                T
Run Code Online (Sandbox Code Playgroud)

要么

Name    Last Name            Middle initial
Bob     Jones    M
Joe     ReallyLongLastName   T
Run Code Online (Sandbox Code Playgroud)

我还需要做什么?

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

Pet*_*der 30

使用std::setw<iomanip>

例如

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

cout << setw(10) << "This" <<
        setw(10) << "is" <<
        setw(10) << "a" <<
        setw(10) << "test" << '\n';
Run Code Online (Sandbox Code Playgroud)

输出:

      This        is         a      test
Run Code Online (Sandbox Code Playgroud)

  • 我想你也应该使用`cout << left` (8认同)

Pét*_*rök 7

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

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

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


Ale*_*min 6

使用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", "");
Run Code Online (Sandbox Code Playgroud)

哪个产生:

Name    Last Name            Middle initial
Bob     Jones                M
Joe     ReallyLongLastName   T
Run Code Online (Sandbox Code Playgroud)

  • 很公平,但鉴于标签,也许首选的是iostream解决方案. (3认同)