如何正确格式化此表?

时间:2017-12-07 14:46:44

标签: c++ while-loop string-formatting

我正在尝试正确格式化表格,以便在每列的下方打印出值,从该列的第一个字符开始。我已成功格式化了三列,但我无法弄清楚如何格式化K Count和LM Count列,以便以简洁的方式打印出来。

我可以对代码的while循环部分进行哪些更正,以便将K计数和LM计数列整齐打印出来?

void printTable(const vector<int>& z, const vector<long>& x, const 
vector<long>& y,
const vector<int>& a, const vector<int>& b)
{
ostringstream ss;
ss << "\n\n\n" << setw(10) << left << "Digits" << "Input Numbers       "
    << setw(11) << right << "K Output   " << setw(6)
    << right << "K Count     " << setw(10) << right << "LM Output   " << setw(6)
    << right << "LM Count" << endl;


int i = 0, n = 0;
while (i < 5)
{
    string q = to_string(z[2*n]) + " x " + to_string(z[abs(2*n + 1)]);
    string r = to_string(x[i]);
    string s = to_string(a[i]);
    string t = to_string(y[i]);
    string u = to_string(b[i]);

    ss << setw(10) << left << (i+1) <<  q
        << setw(16) << right << r
        << setw(11) << right << s
        << setw(12) << right << t
        << setw(10) << right << u << endl;

    i++;
    n++;
}

string r = ss.str();
cout << r;
}

enter image description here

2 个答案:

答案 0 :(得分:1)

您正在打印以下内容:
- 数字左对齐超过10个字符
- 直接后跟输入编号,不指定宽度
- K输出右对齐超过16个字符
您应该改为指定输入数字的宽度 试试这个:

ss << setw(10) << left  << (i+1) <<
      setw(16) << left  << q <<
      setw(10) << right << s <<
      setw(12) << right << t <<
...

每列的确切宽度可能不正确。亲自尝试一下。

答案 1 :(得分:1)

要修复K Count输出,您应该在设置上一个结果的宽度后重置光标以对齐左边,然后向右移动。这样的事情应该做你想做的事。

ss << setw(10) << left  << (i+1) << right
    setw(16) << left << q << right <<
    setw(11) << left << r << right <<
    setw(12) << left << s << right <<
    setw(12) << left << t << right <<
    setw(10) << left << u << right << endl;