如何对齐来自数组的不同长度的输出

How do you align output of different lengths coming from an array?

本文关键字:输出 数组 何对齐 对齐      更新时间:2023-10-16

我正在制作一个饮料机程序,我希望所有的价格都一致。

有没有办法告诉编译器从行首开始写价格X个空格,而不是在发布饮料名称后添加空格?

int main()
{
const int arrsize = 5;
Drinks arr[arrsize] = {
    {"Cola",.75,20},
    {"Root Beer",.75,20},
    {"Lemon-Lime",.75,20},
    {"Grape Soda",.80,20},
    {"Cream Soda",.80,20},
};
for (;;){
    cout << "Please select a drink: "<<endl;
for (int i = 0; i < arrsize; i++){
    cout << (i+1)<<". "<< arr[i].DrinkName;
    cout << setw(10) << setfill(' ')<< right <<fixed << arr[i].DrinkCost<<endl;
}
cout <<"6. Quit";
break;
}
return 0;
}

我想要的是它看起来像这样:

Please select a drink:
1. Cola            0.75
2. Root Beer       0.75
3. Lemon-Lime      0.75
4. Grape Soda      0.80
5. Cream Soda      0.80
6. Quit

但结果是这样的:

Please select a drink:
1. Cola        0.75
2. Root Beer     0.75
3. Lemon-Lime      0.75
4. Grape Soda      0.80
5. Cream Soda      0.80
6. Quit

一种方法是对齐字符串文字,即添加空格进行填充。

Drinks arr[arrsize] = {
    {"Cola      ",.75,20},
    {"Root Beer ",.75,20},
    {"Lemon-Lime",.75,20},
    {"Grape Soda",.80,20},
    {"Cream Soda",.80,20},
};

如果仔细查看您的输出,您会发现数字与文本中的10个字符对齐,这正是您所要求的。

您应该格式化文本

cout << (i+1)<<". " << std::setw(15) << std::left << arr[i].DrinkName
     << std::fixed << arr[i].DrinkCost << std::endl;

哦,还有一个小提示:不要对货币值使用浮点类型。

请参阅类似sprintf的std::string格式中的许多详细答案。

C++可以很容易地使用C函数调用,但对于某些函数调用,您需要格外小心。C的printf()或sprintf()调用是获得所需格式的两种方法。

尝试以下操作:

for (;;){
    cout << "Please select a drink: "<<endl;
for (int i = 0; i < arrsize; i++){
    cout << (i+1) << ". ";
    cout << left << setw(12) << setfill(' ') << arr[i].DrinkName;
    cout << setw(5) << fixed << arr[i].DrinkCost << endl;
}