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

如何在C++中将以斜杠/分隔的字符串解析为double类型数组?

解决斜杠分隔字符串解析为double数组的问题

我来帮你梳理下现有代码里的问题,然后给出正确的实现方式:

首先,先说说你当前尝试的代码里的几个关键错误:

  • cin >> rec只会读取到第一个空白字符(比如空格)就停止,没法获取完整的斜杠分隔的整行输入,得用getline(cin, rec)才行
  • record[pos] = stod(token)这里的pos是字符串里分隔符的位置,不是数组的下标,你需要一个单独的计数器来跟踪数组的索引
  • 你的while循环只会处理到最后一个斜杠之前的元素,最后一个没有斜杠结尾的元素会被漏掉

接下来是修正后的完整代码,我会加上注释说明:

#include <iostream>
#include <string>
#include <stdexcept> // 用于捕获stod的转换异常

void make_record() {
    const int size = 4; // 用const修饰固定大小更规范
    double* record = nullptr;
    string rec;

    cout << "Enter record of items separated by / " << endl;
    cout << "Format: Item ID/Quantity/WholesaleCost/RetailCost" << endl;
    
    // 注意:如果之前有cin >> 操作,需要先忽略换行符,否则getline会读空行
    // 如果这是程序里第一次输入,可以去掉下面这行
    // cin.ignore(); 
    
    getline(cin, rec); // 读取完整的一行输入

    record = new double[size];
    string delimiter = "/";
    size_t pos = 0;
    string token;
    int arrIndex = 0; // 用于跟踪数组的下标

    while ((pos = rec.find(delimiter)) != std::string::npos) {
        token = rec.substr(0, pos);
        // 转换前可以先做简单的非空检查,避免空字符串转换出错
        if (!token.empty() && arrIndex < size) {
            try {
                record[arrIndex++] = stod(token);
            } catch (const std::invalid_argument& e) {
                cerr << "Invalid number format: " << token << endl;
                // 这里可以根据需求处理错误,比如退出或者继续
                delete[] record; // 记得释放内存
                return;
            }
        }
        rec.erase(0, pos + delimiter.length());
    }

    // 处理最后一个没有斜杠结尾的元素
    if (!rec.empty() && arrIndex < size) {
        try {
            record[arrIndex] = stod(rec);
        } catch (const std::invalid_argument& e) {
            cerr << "Invalid number format: " << rec << endl;
            delete[] record;
            return;
        }
    }

    // 测试输出数组内容
    cout << "Parsed record: ";
    for (int i = 0; i < size; i++) {
        cout << record[i] << " ";
    }
    cout << endl;

    // 记得释放动态分配的内存,避免内存泄漏
    delete[] record;
}

最后补充几个实用的注意点:

  • 一定要记得释放new出来的数组,不然会有内存泄漏
  • 加上异常捕获很重要,防止用户输入非数字的内容导致程序崩溃
  • 如果在调用getline之前有其他cin输入(比如之前用了cin >>),需要先用cin.ignore()跳过缓冲区里的换行符,否则getline会直接读取到空行

内容的提问来源于stack exchange,提问作者blindfox916

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 15:52:28