C++中使用isdigit()判断vector<string>元素类型并替换字母为0
现存代码的核心问题
- 头文件格式错误:原代码写的
#include string、#include vector缺少尖括号,且没有引入实际用到的、 等依赖头文件 - 逻辑完全错位:
isdigit()的入参要求是单个可转为unsigned char的字符,作用是判断单个字符是否为0-9的数字,传入stof()转换出的浮点数会直接触发未定义行为,完全达不到校验目的 - 异常逻辑写反:原代码不管
stof()转换是否成功,都会在try块内主动抛出自定义异常,无论元素是不是数值都会进入catch分支 - 赋值操作笔误:
eq[i] == "0"是相等比较运算符,不会修改元素值,正确赋值需要用单等号eq[i] = "0" - 越界风险:空vector没有分配对应下标的存储空间,直接访问eq[0]、eq[1]、eq[2]会触发非法内存访问,需要提前指定vector的初始化大小
正确实现方案
核心逻辑不需要用到isdigit()做整串判断:因为你的场景是判断字符串能否转为浮点数,直接利用stof()转换的异常机制即可完成校验,比逐字符判断效率更高、覆盖场景更全:
- 在try块内尝试对当前元素执行
stof()转换 - 若转换未抛出异常,说明当前元素是合法数值,保留原值即可
- 若转换抛出
invalid_argument(无法转成有效数值,也就是包含字母等非数字内容)或out_of_range(数值超出浮点数范围)的异常,直接将该元素赋值为字符串"0"即可
修正后可运行代码
#include <iostream> #include <string> #include <vector> #include <stdexcept> using namespace std; int main() { // 提前初始化vector长度,避免越界访问 vector<string> eq(3); eq[0] = "a"; eq[1] = "3.5"; eq[2] = "7.5"; for (int i = 0; i < eq.size(); i++) { try { // 仅需尝试转换,不需要额外调用isdigit stof(eq[i]); } // 捕获转换失败的两类典型异常 catch (const std::invalid_argument&) { cout << "eq[" << i << "] 不是有效数值" << endl; eq[i] = "0"; cout << "eq[" << i << "] = " << eq[i] << endl; } catch (const std::out_of_range&) { cout << "eq[" << i << "] 数值超出浮点数表示范围" << endl; eq[i] = "0"; cout << "eq[" << i << "] = " << eq[i] << endl; } } return 0; }
内容的提问来源于stack exchange,提问作者MCLyonzo
相关产品推荐
相关产品推荐

