如何从字符串中提取浮点数?C++实现代码运行异常求助
问题描述
我尝试从字符串中提取浮点数,提取完成后将这些浮点数保存到数组中。
以下是我找到的一段参考代码,尽管我已经做了必要的修改,但它仍然无法正常运行:
#include <iostream> #include <string> using namespace std; string a="2,134 43,54 22,334"; string b[30]; int found,i=0; while(a!="\0"){ found=a,find("\t"); for(int f=0;f<found;f++){ b[i]+=a[f]; } a.erase(0,found+1); i++; } for(int d=0;d<i;d++){ cout<<b[d]<<endl; } return 0; }
代码存在的问题
- 语法错误:调用string的find方法时误用了逗号运算符,正确写法是用点号调用成员:
found = a.find("\t"); - 分隔符不匹配:测试字符串里的数值是用空格分隔的,代码里查找的是制表符
\t,永远匹配不到目标,find会返回无效位置值string::npos,后续erase操作直接内存越界崩溃 - 循环逻辑错误:判断字符串是否为空应该用
a.empty()方法,直接和"\0"比较的逻辑不符合C++ string的判断规则 - 结构错误:所有执行语句都写在了全局作用域,C++要求可执行逻辑必须放在函数内部,代码缺失
main函数包裹,根本无法编译 - 类型错误:需求是存储浮点数,代码里定义的数组b是string类型,且字符串里的浮点数用逗号做小数分隔符,直接转数值会识别失败
- 边界处理缺失:没有处理最后一个数值后面没有分隔符的情况,拆分到最后一段时会直接异常
修正后可运行代码
#include <iostream> #include <string> #include <vector> using namespace std; int main() { string a = "2,134 43,54 22,334"; vector<double> res; size_t pos; // 先统一把逗号小数点替换为标准点号,方便后续转浮点数 for (char& ch : a) { if (ch == ',') ch = '.'; } while (!a.empty()) { pos = a.find(" "); string tmp; if (pos == string::npos) { // 已经是最后一个数值 tmp = a; a.clear(); } else { tmp = a.substr(0, pos); a.erase(0, pos + 1); } res.push_back(stod(tmp)); } // 输出验证 for (double num : res) { cout << num << endl; } return 0; }
运行输出
2.134 43.54 22.334
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

