#include <cctype> #include <stack> #include <string> class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 验证IP地址 * @param IP string字符串 一个IP地址字符串 * @return string字符串 */ //核心思想先保存数据,后判断是哪种格式的数据 string solve(string IP) { // write code here int n=IP.size(); std::stack<string> stack; bool enbleipv4=false; bool enbleipv6=false; string mystr; //将数据存入栈中保存 for(int i=0;i<n;i++){ if(IP[i]=='.'){ if(enbleipv4==false) enbleipv4=true; // std::cout<<mystr<<" "; stack.push(mystr); mystr.clear(); }else if(IP[i]==':'){ if(enbleipv6==false) enbleipv6=true; if(i==n-1) return "Neither"; stack.push(mystr); mystr.clear(); } else{ mystr+=IP[i]; if(i==n-1){ stack.push(mystr); // std::cout<<mystr<<" "; mystr.clear(); } } } if(enbleipv4){ return isIpv4(stack) ? "IPv4":"Neither"; } else if(enbleipv6){ return isIpv6(stack) ? "IPv6":"Neither"; } return "Neither"; } //验证数据是否为ipv4 bool isIpv4(stack<string>& stack){ int cnt=0; while(!stack.empty()){ string str=stack.top(); stack.pop(); try { if(str.size()!=1 && str[0]=='0') return false; for(auto s: str){ if(!isdigit(s)) return false; } int num=std::stoi(str); // 尝试转换为double std::cout<<num<<" "; cnt++;//记录ip地址的位数 if(num>=0&&num<=255) { continue; }else{ return false; } } catch (...) { return false; } } return cnt==4? true:false; } //验证是否为ipv6 bool isIpv6(stack<string>& stack){ int cnt=0; while(!stack.empty()){ string str=stack.top(); stack.pop(); cnt++; if(str.size()>4 || str.size()==0) return false; // 检查剩余字符是否都是十六进制数字 for(auto s:str) { if (!isxdigit(s)) { return false; } } } return cnt==8? true:false; } };