class Solution {
public:
/**
* 验证IP地址
* @param IP string字符串 一个IP地址字符串
* @return string字符串
*/
bool onlyHasNum(string str) {
int len = str.size();
if (len == 0) {
return false; // 没有数字
}
for (int i = 0; i < len; i++) {
if (str[i] > '9' || str[i] < '0') {
return false;
}
}
return true;
}
bool isIpv4 (string IP){
// ipv4中不能有:
if (IP.find_first_of(':') != -1) {
return false;
}
// 分割
vector<string>vec;
while(IP.find_first_of('.') != -1) {
int pos = IP.find_first_of('.');
string str = IP.substr(0, pos);
vec.push_back(str);
IP = IP.substr(pos + 1);
}
vec.push_back(IP);
// 先判断个数,再逐一判断字符。
if (vec.size() != 4) {
return false;
}
// 先排除0,再转换成数字范围
for (int i = 0; i < vec.size(); i++) {
if (vec[i][0] == '0') {
return false;
}
if (!onlyHasNum(vec[i])) {
return false;
}
int num = stoi(vec[i]);
if (num > 255 || num < 0) {
return false;
}
}
return true;
// 通过. 分割数字,每个数字范围是0-255,放在vector中
}
bool isIpv6(string IP) {
// 不能有.
if (IP.find_first_of('.') != -1) {
return false;
}
if ( IP.find("::") != IP.npos) {
return false;
}
// 分割存在vector中
vector<string>vec;
while(IP.find_first_of(':') != -1) {
int pos = IP.find_first_of(':');
string str = IP.substr(0, pos);
vec.push_back(str);
IP = IP.substr(pos + 1);
}
vec.push_back(IP);
// 先判断个数,再逐一判断字符。
if (vec.size() != 8) {
return false;
}
// 前面两个不能是0
for (int i = 0; i < vec.size(); i++) {
int tempLen = vec[i].size();
if (tempLen <= 1) {
continue;
}
if (vec[i][0] == '0' && vec[i][1] == '0') {
return false;
}
}
return true;
}
string solve (string IP){
bool ipv4 = isIpv4(IP);
if (ipv4) {
return "IPv4";
}
bool ipv6 = isIpv6(IP);
if (ipv6) {
return "IPv6";
}
return "Neither";
}
};