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)
您还应该考虑到不同的编辑者/查看者显示具有不同标签宽度的文本.因此,使用制表符,在一个查看器中看起来很好地排列的文本在另一个看起来可能看起
如果你真的想要产生漂亮的排列,可以使用填充空格,你可以对文本进行两次传递:首先计算每列的最大宽度,然后为每列添加适量的填充空格.对于后者,您也可以使用量身定制的printf电话.
更新:计算列宽基本上意味着计算给定列中的字符串长度.这是可以做到用string::length()或strlen()取决于您是否使用,std::string或char*(建议前者).然后,您只需遍历该列中的所有单词,比较到目前为止的最大单词长度,如果当前单词较长,则将该长度设置为新的最大值.如果将单词存储在STL容器中,您甚至可以使用该std::max_element算法通过单个函数调用为您完成工作.
使用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)