You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 05:45:10