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);
}
};