#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"; } };