468. Validate IP Address

本文详细介绍了IPv4和IPv6地址的规则,并提供了一种判断字符串是否符合IPv4或IPv6地址格式的方法。通过解析字符串的长度、分隔符及数值范围,实现了对两种IP地址的有效验证。

1、 IPv4的规则:

       (1) 字串总长 7~15 bytes;

       (2) 有三个 ‘.’,

       (3) 每个点隔开的数字长度为  0~3。每个位数 ‘0’~‘9’, 并且三个bit组合范围为 0 ~ 255;

       (4) 四个数字中,开头不可以是 ‘0’;

2、IPv6的规则:

       (1) 字串总长 15 ~ 39,由7个‘:’ 分成 8个数字。

       (2) 每个数字由 4 bytes组成, 并且每个byte是 16进制数字, 允许开头是0。

class Solution {
public:
    string validIPAddress(string IP) {
        string ret = "";
        int pos = IP.find('.');
        if(pos != string::npos) {
            if(isIPV4(IP))
                return "IPv4";
            else
                return "Neither";
        } 
        
        pos = IP.find(':');
        if(pos == string::npos)
            return "Neither";

        if(isIPV6(IP))
            return "IPv6";
        else
            return "Neither";
        
    }
    
    bool getNum(string str) {
        if(str.size()==0 || str.size() > 3) return false;
        
        if(str.size() != 1 && str[0] == '0')
            return false;
        
        for(int i=0;i<str.size();i++) {
            char c = str[i];
            if(c < '0' || c > '9')
                return false;
        }
        int num = stoi(str);
        if(num > 255) return false;
        return true;
    }
    
    bool isIPV4(string IP) {
        if(IP.size() > 15 || IP.size() < 7)
            return false;
        
        int pos;
        string str;
        
        //three number;
        for(int i=0;i<3;i++) {
            pos = IP.find(".");
            if(pos == string::npos) return false;
            str = IP.substr(0,pos);
            if(!getNum(str)) return false;
            IP = IP.substr(pos+1);
        }
        
        //the fourth
        return getNum(IP);
    }
    
    bool getNum6(string str) {
        if(str.size() == 0 || str.size() > 4)
            return false;

        for(int i=0;i<str.size();i++) {
            char c = str[i];
            if(isalpha(c))
                c = tolower(c);
            if((c <= '9' && c >='0') || (c >= 'a' && c<='f'))
                continue;
            else
                return false;
        }
        
        return true;
    }
    
    bool isIPV6(string IP) {
        if(IP.size() > 39 || IP.size() < 15)
            return false;
        
        int pos;
        string str;
        //7 nums
        for(int i=0;i<7;i++) {
            pos = IP.find(":");
            if(pos == string::npos) return false;
            str = IP.substr(0,pos);
            if(!getNum6(str)) return false;
            IP = IP.substr(pos+1);
        }
        
        return getNum6(IP);
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值