如何在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
相关产品推荐
相关产品推荐

