tem*_*def 12

我想你要找的是

cout << left << setw(8) << (c->name ? c->name : "") << " - " << c->help << endl;
Run Code Online (Sandbox Code Playgroud)

leftsetw(8)操纵起来有作为的效果相同%-8s的格式说明符printf.#include <iomanip>但是,为了使它能够工作,你需要使用setw.

编辑:正如Matthieu M.所指出的,上面将永久改变,cout以便任何填充操作打印出左对齐.请注意,这并不像看起来那么糟糕; 它仅适用于您明确用于setw设置某些填充的情况.您有几个选项可以解决这个问题.首先,你可以强制执行在使用之前的规则setw,你总是使用leftright操纵器分别左右对齐文本.或者,您可以使用flagssetf函数捕获标志的当前状态cout:

ios_base::fmtflags currFlags = cout.flags();
cout << left << setw(8) << (c->name ? c->name : "") << " - " << c->help << endl;
cout.setf(currFlags, ios_base::adjustfield);
Run Code Online (Sandbox Code Playgroud)

这分三步进行.第一行读取当前格式化标志cout,包括它当前如何对齐填充输出.第二行实际打印出值.最后,最后一行cout将内部对齐的输出标志重置为旧值.

就个人而言,我认为第一种选择更具吸引力,但知道第二种选择存在是绝对好的,因为它在技术上更正确.

  • Uglyness!我的眼睛!他们烧!+1 (8认同)
  • @ Marlon-我从来没有找到一个好的I/O库,其格式不会导致眼睛烧伤.我个人更喜欢这个版本而不是`printf`,因为它更清楚它正在做什么,即使它更冗长.另外,我曾经打破了我的逗号/左角括号键,所以在最长的时间里,我害怕不得不输入这样的东西.:-) (4认同)

Fre*_*Foo 9

如果你有Boost库:

std::cout << boost::format("%-8s - %s\n") % (c->name ? c->name : "") % c->help;
Run Code Online (Sandbox Code Playgroud)