#include <string>
class Solution {
public:
/**
IPv4:四组一字节,十进制0-255,分割点. ,且不能有前导零,不能缺省
IPv6:八组两字节,十六进制a-f和A-F,每组最多4位,通过冒号:分割,可以零开头,不可缺省,。
*/
string solve(string IP) {
if(IP.size() == 0){
return "Neither";
}
if(IP.find('.') != string::npos){
return isipv4(IP);
}else if(IP.find(':') != string::npos){
return isipv6(IP);
}
return "Neither";
}
vector<string> split(string& ip, char spliter){
vector<string> res;
int i=0;
while((i = ip.find(spliter)) && i != string::npos){ //如果找到了第一个点就返回,string的find返回的是下标或者s.npos(表示未找到)
res.push_back(ip.substr(0, i));
ip = ip.substr(i+1);
}
res.push_back(ip); //最后一节没有点使得其入栈,手动入栈
return res;
}
string isipv6(string& IP){
vector<string> ip_6 = split(IP, ':');
if(ip_6.size() != 8)return "Neither";
for(string s:ip_6){
if(s.size() == 0 || s.size()>4){
return "Neither";
}
for(char c:s){
if( !isdigit(c) && !(c >= 'a' && c <= 'f') && !(c >= 'A' && c <= 'F') ){
return "Neither";
}
}
}
return "IPv6";
}
string isipv4(string& IP){
vector<string> ip_4 = split(IP, '.');
if(ip_4.size() != 4)return "Neither"; //4 groups
for(string node:ip_4){
if( node.size() == 0 || node.size()>3 || (node.size() != 1 && node[0]=='0') ) //不缺行,无前导零
return "Neither";
for(char c:node){
if(!isdigit(c)){
return "Neither"; //只能是数字;
}
}
int num = stoi(node);
if(num<0 || num>255){ //数字范围
return "Neither";
}
}
return "IPv4";
}
};