本文已参与「新人创作礼」活动,一起开启掘金创作之路。
问题
思路
对于 IPv4,分别检查 ip 长度,前导0,用 '.' 分开的数字的合法性。
对于 IPv6,检查步骤包裹了校验 IPv4 的3个步骤,此外,还包括了':'个数的检查。
代码实现
class Solution {
public:
/**
* 验证IP地址
* @param IP string字符串 一个IP地址字符串
* @return string字符串
*/
bool isIpv4(string& IP)
{
stringstream ss;
vector<string> vec;
ss << IP;
string tmp;
while (getline(ss, tmp, '.'))
{
vec.push_back(tmp);
}
// ip 地址长度判断
if (vec.size() != 4) return false;
for (auto x : vec)
{
// 无效 0
if (x[0] == '0' && x.size() > 1) return false;
// 数值范围
if (stoi(x) > 255) return false;
// 不是数字
for (auto c : x) if (!isdigit(c)) return false;
}
return true;
}
bool isIpv6(string& IP)
{
stringstream ss;
vector<string> vec;
ss << IP;
string tmp;
while (getline(ss, tmp, ':'))
{
vec.push_back(tmp);
}
// ipv6 长度判断
if (vec.size() != 8) return false;
for (auto x : vec)
{
if (x.size() == 0) return false;
// 无效 0
if (strtol(x.data(), NULL, 16) == 0 && x.size() > 1) return false;
// 数值范围
if (strtol(x.data(), NULL, 16) > 0xffff) return false;
// 检查字符为16进制字符
for (auto c : x) if (tolower(c) > 'f') return false;
}
// 统计 “:” 个数
int count = 0;
for (auto c : IP) if (c == ':') count++;
if (count != 7) return false;
return true;
}
string solve(string IP) {
// write code here
if (isIpv4(IP)) return "IPv4";
else if (isIpv6(IP)) return "IPv6";
else return "Neither";
}
};