
class Solution {
public:
vector<string> split(string str, string flag){
vector<string> res;
int fd = 0;
// 注意前面是赋值。fd = str.find(flag)
// 后面是判断,如果fd == str.npos说明没找到
while((fd=str.find(flag))&&fd!=str.npos){
res.push_back(str.substr(0,fd)); // 从0开始截取fd个字符串
str = str.substr(fd+1); // 更新str
}
res.push_back(str); // 加上最后还剩下的尾部
return res;
}
string validIPAddress(string IP) {
if(checkIPv4(IP)){
return "IPv4";
}else if(checkIPv6(IP))
return "IPv6";
else
return "Neither";
}
bool checkIPv4(string IP){
vector<string> IPv4str = split(IP,"."); // 按照点分割
int len = IPv4str.size();
if(len!=4)
return false;
for(auto s:IPv4str){
if(s.empty()||s.size()==0||s.size()>3) // 为空,或者位数超过3
return false;
// 判断每一位是不是数字
for(auto str:s){
cout<<"str1:"<<endl;
if(!isdigit(str))
return false;
}
// 只有在上面判断完成是不会数字基础上,才能调用stoi
if(to_string(stoi(s)).size()<s.size()) // 判断是否含有无效0
return false;
if(stoi(s)<0||stoi(s)>255) // 判断是不是超过int范围
return false;
}
return true;
}
bool checkIPv6(string IP){
vector<string> IPv6str = split(IP,":"); // 按照点分割
int len = IPv6str.size();
if(len!=8)
return false;
for(auto s:IPv6str){
if(s.empty()||s.size()==0||s.size()>4) // 为空,或者位数超过4
return false;
for(char str:s){ // 对每一位范围判断
if(!(isdigit(str)||str>='a'&&str<='f'))
if(!(isdigit(str)||(str>='a'&&str<='f')||(str>='A'&&str<='F')))
return false;
}
}
return true;
}
};