C++实现IPv4地址验证代码提交报SIGABRT错误的原因是什么?
问题根因
代码抛出SIGABRT的核心原因是未处理循环结束后临时字符串temp为空的场景,直接调用stoi()触发未捕获的C++标准异常,导致程序主动中止。
典型触发用例是末尾带点的非法IP,比如192.168.1.:
- 循环处理到最后一个字符
.时,会正常校验前一段内容、清空temp、dot计数减为-1 - 循环结束后temp是空字符串,此时执行
stoi(temp)会抛出std::invalid_argument异常,代码没有捕获该异常,操作系统直接发送SIGABRT信号终止程序。
其他可优化点
代码中多次重复调用stoi(temp),可以先将转换结果存为变量,避免重复计算损耗性能;同时可以提前判断dot计数为负的场景,提前返回错误减少无效计算。
修复后代码
class Solution { public: int isValid(string s) { if(s.size() == 0 || s.size() > 15){ return 0; } string temp = ""; int dot = 3; for(int i = 0 ; i < s.size() ; i++){ if(temp.size() > 3){ return 0; } if(s[i] == '.'){ if(temp.size() == 0){ return 0; } int num = stoi(temp); if(temp.size() != to_string(num).size() || num > 255){ return 0; } temp.clear(); dot--; // 点数量超过3提前返回 if(dot < 0) return 0; } else { if((s[i]-'0')>= 0 && (s[i]-'0')<=9){ temp.push_back(s[i]); } else{ return 0; } } } // 先判断temp非空、点数量正确,再做数值校验,避免空串调用stoi if(temp.empty() || dot != 0){ return 0; } int num = stoi(temp); if(temp.size() != to_string(num).size() || num > 255){ return 0; } return 1; } };
内容的提问来源于stack exchange,提问作者va_0511
相关产品推荐
相关产品推荐

