[字符串]验证IP地址

126 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

问题

Screenshot_select-area_20220617083045.png

思路

对于 IPv4,分别检查 ip 长度,前导0,用 '.' 分开的数字的合法性。

对于 IPv6,检查步骤包裹了校验 IPv4 的3个步骤,此外,还包括了':'个数的检查。

代码实现

class Solution {
public:
    /**
     * 验证IP地址
     * @param IP string字符串 一个IP地址字符串
     * @return string字符串
     */
    bool isIpv4(string& IP)
    {
        stringstream ss;
        vector<string> vec;
        ss << IP;
        string tmp;
        while (getline(ss, tmp, '.'))
        {
            vec.push_back(tmp);
        }
        // ip 地址长度判断
        if (vec.size() != 4) return false;
        for (auto x : vec)
        {
            // 无效 0
            if (x[0] == '0' && x.size() > 1) return false;
            // 数值范围
            if (stoi(x) > 255) return false;
            // 不是数字
            for (auto c : x) if (!isdigit(c)) return false;
        }
        return true;
    }
    
    bool isIpv6(string& IP)
    {
        stringstream ss;
        vector<string> vec;
        ss << IP;
        string tmp;
        while (getline(ss, tmp, ':'))
        {
            vec.push_back(tmp);
        }
        // ipv6 长度判断
        if (vec.size() != 8) return false;
        for (auto x : vec)
        {
            if (x.size() == 0) return false;
            // 无效 0
            if (strtol(x.data(), NULL, 16) == 0 && x.size() > 1) return false;
            // 数值范围
            if (strtol(x.data(), NULL, 16) > 0xffff) return false;
            // 检查字符为16进制字符
            for (auto c : x) if (tolower(c) > 'f') return false;
        }
        // 统计 “:” 个数
        int count = 0;
        for (auto c : IP) if (c == ':') count++;
        if (count != 7) return false;
        return true;
    }
    string solve(string IP) {
        // write code here
        if (isIpv4(IP)) return "IPv4";
        else if (isIpv6(IP)) return "IPv6";
        else return "Neither";
    }
};