class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 验证IP地址 * @param IP string字符串 一个IP地址字符串 * @return string字符串 */ string solve(string IP) { // write code here string ans = "Neither"; int n = IP.size(); // 字符穿首字符或末尾是'.'或':'则不符合; if(IP.front()=='.' || IP.front()==':' || IP.back()=='.' || IP.back()==':') return ans; if(IP.find('.')!=string::npos && IP.find(':')==string::npos) { // 判断是否为有效IPv4 int i=0; // 看看是不是只有四组 int flag = 0; while(i<=n) { ++flag; int index = IP.find('.',i)!=string::npos ? IP.find('.',i) : n; string str = IP.substr(i,index-i); int str_len = str.size(); int str_num = stoi(str); // 空的组、有0开头、超出范围、大于4组都不是有效IPv4 if(str.empty() || (str.front()=='0' && str_len>1) || (str_num<0 || str_num>255) || flag>4) return ans; // 确保str每个字符都是数字 for(auto t:str) { if(!isdigit(t)) { return ans; } } i = index+1; } ans = "IPv4"; } else if(IP.find('.')==string::npos && IP.find(':')!=string::npos) { // 判断是否为有效IPv6 int i=0; // 看看是不是只有8组 int flag = 0; while(i<=n) { ++flag; int index = IP.find(':',i)!=string::npos ? IP.find(':',i) : n; string str = IP.substr(i,index-i); int str_len = str.size(); // 空的组、有0开头、超出范围、大于8组都不是有效IPv6 if(str.empty() || (str.front()=='0' && str_len>4) || flag>8) return ans; for(auto t:str) { if(t!='a' && t!='b' && t!='c' && t!='d' && t!='e' && t!='f' && t!='A' && t!='B' && t!='C' && t!='D' && t!='E' && t!='F' && (t-'0'<0 || t-'0'>9)) { // cout << t << endl; return ans; } } i = index+1; } ans = "IPv6"; } return ans; } };