C ++ - 无法对齐输出

时间:2014-04-08 18:29:09

标签: c++ formatting output

我有一个迭代一些并行数组的函数,并在循环控制变量中打印内容。我有另一个在我的程序中用来打印与ID相关联的名称的循环控制变量值。这是2个函数

void PrintName(int ID)
{
    switch (ID)
    {
    case 0: cout << "computer(s)";
        break;
    case 1: cout << "pencil(s)";
        break;
    case 2: cout << "pen(s)";
        break;
    case 3: cout << "book(s)";
        break;
    case 4: cout << "beer(s)";
        break;
    case 5: cout << "ruler(s)";
        break;
    case 6: cout << "stereo(s)";
        break;
    case 7: cout << "refrigerator(s)";
        break;
    case 8: cout << "desk(s)";
        break;
    case 9: cout << "backpack(s)";
        break;
    }
}

void PrintSummary(InvIDList invIDs, ItemQuantity itemQuant, int totalWeight, int totalPurch, int budget)
{
    cout << "ID      NAME      QUANTITY" <<endl;
    cout << "--------------------------" <<endl;
    for(int i = 0; i < 10; i++){
        cout << invIDs[i];
        PrintName(i);
        cout << itemQuant[i] <<endl;
    }
    cout << "\n\nTotal Amount Spent: $" << totalPurch <<endl;
    cout << "Amount of Budget Remaining: $" << budget <<endl;
    cout << "Total Weight of Items Purchased: " << totalWeight <<endl;
}

我希望输出在IDNAMEQUANTITY下很好地对齐,ID最左边,QUANTITY是最右边的,{ {1}}居中。不幸的是,我无法弄清楚如何在经过数小时修补代码后实现这一点,主要是让NAME一直向右对齐。

3 个答案:

答案 0 :(得分:1)

您希望返回一个与std :: cout一起使用的字符串对象,而不是使用PrintName函数。为了正确对齐列,您可能需要查看<iomanip>标头,尤其是std :: setw(n)操纵器。

下面是一个示例,请注意,虽然我将列宽设置为16个字符,但您应该做的是计算每个类别的最大字符数并相应地更改宽度。有趣的是,您可以为每列指定不同的宽度。

string ReturnName(int ID)
{
    switch (ID)
    {
    case 0: return "computer(s)";
        break;
    case 1: return "pencil(s)";
        break;
    case 2: return "pen(s)";
        break;
    case 3: return "book(s)";
        break;
    case 4: return "beer(s)";
        break;
    case 5: return "ruler(s)";
        break;
    case 6: return "stereo(s)";
        break;
    case 7: return "refrigerator(s)";
        break;
    case 8: return "desk(s)";
        break;
    case 9: return "backpack(s)";
        break;
    }
}

void PrintSummary(InvIDList invIDs, ItemQuantity itemQuant, int totalWeight, int totalPurch, int budget)
{
cout << left << setw(16) << "ID";
cout << left << setw(16) << "NAME";
cout << left << setw(16) << "QUANTITY" << endl;
cout << "--------------------------------------" << endl;
for(int i = 0; i < 10; i++){

    cout << left << setw(16) << invIDs[i];
    cout << left << setw(16) << ReturnName(i);
    cout << left << setw(16) << itemQuant[i] << endl;
}
cout << "\n\nTotal Amount Spent: $" << totalPurch <<endl;
cout << "Amount of Budget Remaining: $" << budget <<endl;
cout << "Total Weight of Items Purchased: " << totalWeight <<endl;
}

答案 1 :(得分:0)

不要在PrintName中打印名称,而只是将名称作为字符串返回。然后在循环中,您将获得正确对齐列所需的所有信息。

哦,您可能想要更改PrintName的名称。

答案 2 :(得分:0)

你已将标题打印为

cout << "ID      NAME      QUANTITY" <<endl;

你假设上面给出的空格,但你永远不知道有多少空间

invIDs[i]

 PrintName(i);

take。所以你可以照顾每一个的最大长度。例如,知道开关输出的最大长度是多少。然后修改标题打印语句,包括那么多空格。