C++订单收据字符串对齐存储与打印问题求助
解决C++食品订单收据的字符串对齐问题
我明白你现在遇到的订单对齐难题——直接拼接字符串导致内容乱糟糟,没法像预期那样整齐排列。其实核心问题是你没给每个字段设置固定宽度的格式化规则,下面就给你具体的解决方案:
问题根源
你当前用full_menu[main_menu_number][sub_menu]+" "+to_string(quantity)+" "+to_string(price)+"\n"这种方式拼接字符串,不同食品名称长度差异大,单纯的空格分隔没法让数量、价格列对齐;而且to_string(double)默认输出6位小数,虽然格式对了,但对齐还是得靠专业的格式化工具。
解决方案:用stringstream配合格式化操作符
我们可以用<sstream>头文件里的stringstream来构建每一行订单,它能像cout一样使用setw、left、right这些格式化工具,轻松实现固定宽度对齐。
修改步骤:
- 先引入
<sstream>头文件,因为要用到stringstream对象。 - 在循环内创建
stringstream来处理单条订单的格式化。 - 给每个字段设置固定宽度和对齐方式:
- 食品名称:设置足够容纳最长名称的宽度(比如25),左对齐(
left),短名称后面自动补空格。 - 数量:设置固定宽度(比如8),右对齐(
right),让数字整齐靠右。 - 价格:用
fixed和setprecision控制小数位数,同时设置固定宽度(比如10),右对齐。
- 食品名称:设置足够容纳最长名称的宽度(比如25),左对齐(
- 把格式化好的单行内容追加到
orders变量里。
修改后的核心代码
替换你原来的orders.append(...)部分,改成下面这段:
// 新增头文件 #include <sstream> // ... 其他代码不变 ... // 替换原来的orders.append行 stringstream order_line; // 食品名称左对齐,宽度25 order_line << left << setw(25) << full_menu[main_menu_number][sub_menu]; // 数量右对齐,宽度8 order_line << right << setw(8) << quantity; // 价格右对齐,宽度10,保留6位小数(和你预期一致) order_line << right << setw(10) << fixed << setprecision(6) << price << "\n"; // 把格式化后的行加到orders里 orders += order_line.str();
完整修改后的代码
#include <iostream> #include <typeinfo> #include <iomanip> #include <sstream> // 新增头文件 using namespace std; void menu() { string full_menu [3][6] = {{ "A. Chicken", "1.chicken leg barbecue", "2.general chicken", "3.chicken liver abodo", "4.buffalo wings", "5.Permesan wings" }, { "B. Soup", "1.mushroom soup", "2.cream of corn soup", "3.hototay soup", "4.Papaitan soup", "5.Bulalo soup" }, { "C. Beverages", "1.coke", "2.diet coke", "3.cherry coke", "4.sprite", "5.Aqua-Panna" }}; for(int parent=0; parent<3; parent++) { for(int child=0;child<6;child++) { cout<<full_menu[parent][child]<<endl; } } //user select the choices and quantity string orders; int quantity; double price; for (int i =0; ;i++) { // 修正原死循环条件,靠break退出 //food_name// cout << "Enter your orders(example A1 or b3: "; int main_menu_number=0; char main_menu; int sub_menu = 0; cin >> main_menu; if (main_menu == 'a' || main_menu == 'A') { main_menu_number = 0; } else if (main_menu == 'b' || main_menu == 'B') { main_menu_number = 1; } else if (main_menu == 'c' || main_menu == 'C') { main_menu_number = 2; } else if(main_menu=='x'||main_menu=='X'){ break; } cin>>sub_menu; //price// if (main_menu_number==0&&sub_menu==1){ price=5.00; } else if(main_menu_number==0&&sub_menu==2) { price=7.00; } else if(main_menu_number==0&&sub_menu==3) { price=5.50; } else if(main_menu_number==0&&sub_menu==4) { price=8.00; } else if(main_menu_number==0&&sub_menu==5) { price=7.50; } else if(main_menu_number==1&&sub_menu==1) { price=4.00; } else if(main_menu_number==1&&sub_menu==2) { price=5.50; } else if(main_menu_number==1&&sub_menu==3) { price=7.00; } else if(main_menu_number==1&&sub_menu==4) { price=8.00; } else if(main_menu_number==1&&sub_menu==5) { price=7.50; } else if(main_menu_number==2&&sub_menu==1) { price=1.50; } else if(main_menu_number==2&&sub_menu==2) { price=1.50; } else if(main_menu_number==2&&sub_menu==3) { price=1.50; } else if(main_menu_number==2&&sub_menu==4) { price=1.50; } else if(main_menu_number==2&&sub_menu==5) { price=0.30; } cout<<"Enter quantity :"; cin>>quantity; // 新增的格式化代码 stringstream order_line; order_line << left << setw(25) << full_menu[main_menu_number][sub_menu]; order_line << right << setw(8) << quantity; order_line << right << setw(10) << fixed << setprecision(6) << price << "\n"; orders += order_line.str(); } cout<<orders; } int main() { menu(); }
(注:顺便帮你修正了原代码里的死循环条件for (int i =0; i <=i ;i++),改成靠break退出的循环更合理)
修改后的输出效果
现在输入相同的内容后,输出会变成:
1.chicken leg barbecue 2 5.000000 3.cherry coke 2 1.500000
完全符合你预期的对齐格式!
内容的提问来源于stack exchange,提问作者Tasif
相关产品推荐
相关产品推荐

