解题思路:
两个函数分别判断是否是IPV4和IPV6,两个函数的思想差不多:逐位遍历,到分隔符,对每一部分做合法检验,最后对总长度(4 or 8)做一个合法检验
string validIpAddress(string IP)
{
if (IsIPv4(IP))
return "IPv4";
else if (IsIPv6(IP))
return "IPv6";
else
return "Neither";
}
bool IsIPv4(string IP)
{
string tmp = ""; //用来暂存分区数值:要>=0 && <256
int count = 0; //分区个数:不超过4个
int count1 = 0; //分区数值位数: 最大为3位,超过的可以不需要再转化为整数来判断是否溢出
for (int i = 0; i < IP.length(); i++)
{
//这里不要忘记引入'\0',这样才能得到最后一个分区
if (IP[i] != '.' && IP[i] != '\0')
{
if (IP[i] < '0' || IP[i] > '9')
return false;
tmp += IP[i];
count1++;
if (count1 >= 4)
return false;
}
else
{
//排除:1..2.3.4这种情况
if (tmp != ""&& stoi(tmp) >= 0 && stoi(tmp) < 256)
{
//排除前导零情况
if (tmp[0] == '0' && tmp.length() > 1)
return false;
count++;
if (count == 4)
return i == IP.length();
}
else
return false;
//每一个分区计算完毕后,要恢复
tmp = "";
count1 = 0;
}
}
return false;
}
bool IsIPv6(string IP)
{
//只需要计算分区位数和分区个数,以及一些情况的判断
int count1 = 0;
int count = 0;
for (int i = 0; i < IP.length(); i++)
{
if ((IP[i] >= '0' && IP[i] <= '9') || (IP[i] >= 'a'&&IP[i] <= 'f') || (IP[i] >= 'A' && IP[i] <= 'F'))
{
count1++;
if (count1 > 4)
return false;
}
else if (IP[i] == ':' || IP[i] == '\0')
{
//::情况
if (count1 == 0)
return false;
count++;
count1 = 0;
if (count == 8)
return i == IP.length();
}
else
return false;
}
return false;
}