class Solution {
public:
string validIPAddress(string queryIP) {
//首先是分隔,分隔后放在vector里
//之后分别进行检验 1.vector的长度要符合要求
//2. vector中的内容要符合要求
if (isIPv4(queryIP)) return "IPv4";
if (isIPv6(queryIP)) return "IPv6";
return "Neither";
}
bool isIPv4(string queryIP){
vector<string> splited;
split(queryIP, splited, '.');//分隔字符
if(splited.size()!=4) return false;//分隔后的字符长度是否为4
for(string x: splited){//对分隔后的每一个字符串
if(x.size()==0 || x.size()>3) return false;//如果长度不是1,2,3则返回false
if(x.size()>1 && x[0]=='0') return false;//首字符不能是0
for(char c: x){//每个字符必须是数字
if(isdigit(c)==false) return false;
}
int num = stoi(x);//对分割后的字符串,转化为数字
if(num<0 || num>255) return false;//数字要在0-255之间
}
return true;
}
bool isIPv6(string queryIP){
vector<string> splited;
split(queryIP, splited, ':');//分隔字符
if(splited.size()!=8) return false;//分隔后的字符长度如果不是8则返回false
for(string x: splited){//对分隔后的每一个字符串
if(x.size()==0 || x.size()>4) //如果字符串的长度不是1,2,3,4则返回false
return false;
for(char c:x){//对每一个字符
if(c<'0'|| c>'9'&&c<'A' || c>'F'&&c<'a'||c>'f' )//&& 优先级高于||
return false;
}
}
return true;
}
void split (string ip, vector<string>& ret, char spliter){
stringstream ss(ip);//用string初始化stringstream
string temp;
while(getline(ss,temp,spliter)){//getline(数据源,temp_str, 分隔符)
ret.push_back(temp);//返回给结果
}
if(ip.length()>0 && ip.back() == spliter)//处理末尾多出来的分隔符
ret.push_back("");
}
};
下方为错误,能过29/83用例,不知道错哪里了
以下为正确