题解 | 识别有效的IP地址和掩码并进行分类统计
#include <iostream>
#include <array>
using namespace std;
bool ParseIP(string str, array<int, 4>& ip)
{
for (int i = 0; i < 4; i++)
{
int pos = str.find('.');
string sub = str.substr(0, pos);
if (sub.empty())
return false;
ip[i] = stoi(sub);
str = str.substr(pos + 1);
}
return true;
}
bool ParseString(string str, array<int, 4>& ip, array<int, 4>& mask)
{
int pos = str.find('~');
if (pos == -1)
return false;
if (!ParseIP(str.substr(0, pos), ip))
return false;
if (!ParseIP(str.substr(pos + 1), mask))
return false;
return true;
}
const array<int, 7> s_mask = {128, 128+64, 128+64+32, 128+64+32+16, 128+64+32+16+8, 128+64+32+16+8+4, 128+64+32+16+8+4+2};
bool CheckMask(array<int, 4>& mask)
{
bool one = false, zero = false;
for (int i = 0; i < 4; i++)
{
if (mask[i] == 255)
{
if (zero)
return false;
if (!one)
one = true;
continue;
}
if (mask[i] == 0)
{
if (!one)
return false;
if (!zero)
zero = true;
continue;
}
bool find = false;
for (int a: s_mask)
{
if (a == mask[i])
{
find = true;
break;
}
}
if (!find)
return false;
one = true;
if (zero)
return false;
zero = true;
}
return one && zero;
}
int main() {
string str;
int a = 0, b = 0, c = 0, d = 0, e = 0, err = 0, pri = 0;
while (cin >> str)
{
array<int, 4> ip, mask;
if (str.find("0.") == 0 || str.find("127.") == 0)
continue;
if (!ParseString(str, ip, mask))
{
err++;
continue;
}
if (!CheckMask(mask))
{
err++;
continue;
}
if (ip[0] >= 1 && ip[0] <= 126)
a++;
else if (ip[0] <= 191)
b++;
else if (ip[0] <= 223)
c++;
else if (ip[0] <= 239)
d++;
else
e++;
if (ip[0] == 10 || (ip[0] == 172 && ip[1] >= 16 && ip[1] <= 31) || (ip[0] == 192 && ip[1] == 168))
pri++;
}
printf ("%d %d %d %d %d %d %d\n", a, b, c, d, e, err, pri);
}
// 64 位输出请用 printf("%lld")
亮点在CheckMask的部分哦,判断是否有1,是否有0,是否存在0在1前
