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

C++多产品数据读取:未知输入数量时的循环终止问题求助

解决不确定数量的产品-价格对读取问题

嘿,我来帮你搞定这个读取循环的问题!你现在的痛点是不知道什么时候终止循环,因为输入的产品数量不固定,对吧?咱们一步步来解决:

首先,你得利用getline的返回值来判断循环是否继续——getline成功读取内容时会返回输入流对象,这个对象在布尔语境下会被解析为true;当遇到输入结束(EOF)或者读取失败时,会变成false,刚好用来终止循环。

不过要注意,你的输入格式是产品名,价格;这样的项,所以每次循环需要先读产品名(以逗号为分隔符),再读价格(以分号为分隔符)。把这两个getline操作放在循环条件里,确保只有两次读取都成功才进入循环体。

另外,你代码里有几个小拼写错误:proces应该是prices,proce应该是price,还有用固定数组的话容易越界,换成vector会更安全,因为它能动态扩容。还有atoi有点过时,用C++11的stoi更靠谱,遇到无效输入还会抛异常,比atoi只返回0要直观。

给你改好的完整代码:

#include <iostream>
#include <vector>
#include <string>
#include <stdexcept> // 用于捕获stoi的异常

using namespace std;

int main() {
    vector<string> products;
    vector<int> prices;
    string product, price_str;
    int num = 0;

    // 核心逻辑:只要能成功读取产品名和价格字符串,就继续循环
    while (getline(cin, product, ',') && getline(cin, price_str, ';')) {
        // 可选:去除产品名前后的空格(比如输入里的" milk"这种带前导空格的情况)
        size_t start = product.find_first_not_of(" \t");
        if (start != string::npos) {
            size_t end = product.find_last_not_of(" \t");
            product = product.substr(start, end - start + 1);
        }

        products.push_back(product);
        
        // 用stoi转换价格,处理可能的无效输入
        try {
            int price = stoi(price_str);
            prices.push_back(price);
            num++;
        } catch (const invalid_argument& e) {
            cerr << "警告:价格 '" << price_str << "' 不是有效整数,跳过该项" << endl;
            // 如果要跳过无效项,记得把刚加入的产品名也删掉
            products.pop_back();
            continue;
        } catch (const out_of_range& e) {
            cerr << "警告:价格 '" << price_str << "' 超出整数范围,跳过该项" << endl;
            products.pop_back();
            continue;
        }
    }

    // 测试输出读取到的内容
    cout << "读取到的产品列表:" << endl;
    for (int i = 0; i < num; ++i) {
        cout << "- " << products[i] << ":" << prices[i] << endl;
    }

    return 0;
}

关键说明:

  • 循环终止条件:getline(cin, product, ',') && getline(cin, price_str, ';')——只有两次读取都成功才会执行循环体,当输入到末尾(比如用户按下Ctrl+D/Unix或Ctrl+Z/Windows),或者读取失败时,循环自动终止,完美适配不确定数量的输入。
  • 动态存储:用vector<string>和vector<int>代替固定数组,不用担心产品数量超过数组大小导致的越界问题。
  • 错误处理:添加了try-catch块处理stoi的异常,如果输入的价格不是有效整数(比如字母、符号),会给出警告并跳过该项,程序不会直接崩溃。
  • 可选的空格处理:如果输入里有多余的空格(比如分号后面的空格),会自动去除产品名前后的空白字符,让产品名更干净。

这样不管你输入多少个产品项,程序都能正确读取直到输入结束~

内容的提问来源于stack exchange,提问作者David Mata Lorenzo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:38:38