You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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这些格式化工具,轻松实现固定宽度对齐。

修改步骤:

  1. 先引入<sstream>头文件,因为要用到stringstream对象。
  2. 在循环内创建stringstream来处理单条订单的格式化。
  3. 给每个字段设置固定宽度和对齐方式:
    • 食品名称:设置足够容纳最长名称的宽度(比如25),左对齐(left),短名称后面自动补空格。
    • 数量:设置固定宽度(比如8),右对齐(right),让数字整齐靠右。
    • 价格:用fixed和setprecision控制小数位数,同时设置固定宽度(比如10),右对齐。
  4. 把格式化好的单行内容追加到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:18:51