粘贴输入值时C++字符串转float类型出错问题求助
C++批量粘贴浮点数值触发
std::invalid_argument异常的解决方案 我编写了一个C++程序,通过getline读取5个浮点数值,转换为float后计算总和与平均值,支持重复运行。逐个输入时程序正常,但批量粘贴5个值时触发std::invalid_argument异常,报错如下:
terminate called after throwing an instance of 'std::invalid_argument'
what(): stof
Aborted
dash: 2: 5.0: not found
dash: 4: 15.0: not found
dash: 6: 20.0: not found
dash: 8: 10.0: not found
尝试通过检查行长度判断是否包含换行,但未解决问题,希望实现批量粘贴功能。原代码如下:
#include <stdio.h> #include <string> #include <iostream> #include <iomanip> using namespace std; int main() { int i; string token, n; float n2, total; cout<<"Input 5 floating numbers"<<endl; while(true){ for( i = 0; i < 5 ; i++){ getline(cin, n); //cout<<n.length()<<endl; token = n.substr(0, n.find("\n")); n2 = stof(n); //cout<<n<<endl; //n2 = stof(n); //cout<<typeid(n).name()<<endl; if (n.length() > 0) { n2 = stof(n); total = total + n2; } else cout<<"n2 = "<<n<<endl; //cout<<n2<<endl; } cout<<fixed<<setprecision(2); cout<<"Total = "<<total<<endl; cout<<"Average = "<<total/i<<endl; } return 0; }
输入示例:
10.0 5.0 15.0 20.0 10.0
问题原因分析
- 变量未初始化:
total未赋初始值,默认是随机垃圾值,会导致计算结果错误,批量粘贴时可能触发不可预期的行为。 stof调用时机错误:在判断输入是否为空之前就调用stof(n),若批量粘贴内容包含空行或无效字符,会直接抛出异常导致程序崩溃。- 无效的换行符处理:
getline会自动读取到换行符并丢弃,因此n.find("\n")必然返回string::npos,对应的substr操作完全无效。 - 无异常处理机制:没有捕获
stof可能抛出的异常,也未对无效输入做容错处理,程序鲁棒性差。
修正后的代码
#include <string> #include <iostream> #include <iomanip> #include <stdexcept> using namespace std; int main() { int i; string n; float n2, total; cout << "Input 5 floating numbers" << endl; while (true) { total = 0.0; // 每轮计算前重置总和 for (i = 0; i < 5; ) { // 仅在输入有效时递增计数 getline(cin, n); // 跳过空行 if (n.empty()) { continue; } try { n2 = stof(n); total += n2; i++; // 输入有效,计数加1 } catch (const invalid_argument&) { cout << "无效输入,请输入有效的浮点数:" << endl; } catch (const out_of_range&) { cout << "输入数值超出范围,请重新输入:" << endl; } } cout << fixed << setprecision(2); cout << "Total = " << total << endl; cout << "Average = " << total / 5 << endl; cout << "\n请继续输入5个浮点数(按Ctrl+C退出):" << endl; } return 0; }
关键修改说明
- 初始化并重置总和:每次循环开始将
total设为0.0,确保每轮计算独立,不会累加之前的结果。 - 优化输入计数逻辑:将
for循环的递增操作移到有效输入之后,空行或无效输入不会占用计数名额,保证总能收集到5个有效数值。 - 异常捕获处理:用
try-catch捕获stof可能抛出的格式错误和范围错误异常,提示用户重新输入,避免程序崩溃。 - 移除无效代码:删除了多余的
token变量和无意义的换行符处理逻辑,简化代码结构。 - 明确平均值计算:直接用固定值5计算平均值,避免因
i值意外变化导致错误。
内容的提问来源于stack exchange,提问作者junaid umar
相关产品推荐
相关产品推荐

