重点应该是掩码的计算上,供参考。
#include <iostream>
#include <sstream>
using namespace std;
enum type{
A,
B,
C,
D,
E,
Err,
Pirv,
};
int IP[8];
int ANS[7];
int main(void)
{
string s;
unsigned int mask;
unsigned int ip;
while (cin >> s){
stringstream ss(s);
int i;
int j = 0;
while (ss >> i){
// cout << i << endl;
ss.get();
IP[j] = i;
j += 1;
}
//cout << "s : " << s << endl;
if (j != 8) {
ANS[type::Err] += 1;
//cout << "input error: " << s << endl;
continue;
}
// 特判 [0.*.*.*]
if (IP[0] == 0) continue;
// 检查掩码的有效性
mask = IP[4] << 24 | IP[5] << 16 | IP[6] << 8 | IP[7];
// 特判 [255.255.255.255]
if (mask == 0xffffffff){
ANS[type::Err] += 1;
continue;
}
// cout << "mask : " << mask << endl;
// 从低位开始检测
bool startOne = false;
bool correct = true;
for (int i = 0; i < 32; i ++){
if (startOne && (mask & 0x01 << i)==0){
correct = false;
break;
}
if (mask & 0x01 << i){
startOne = true;
}
}
if (!correct) {
ANS[type::Err] += 1;
//cout << "mask error: " << s << endl;
continue;
}
// 开始IP 大类类型判断
if (IP[0] >= 1 && IP[0] < 127){
ANS[type::A] += 1;
}else if (IP[0] >= 128 && IP[0] < 192){
ANS[type::B] += 1;
}else if (IP[0] >= 192 && IP[0] < 224){
ANS[type::C] += 1;
}else if (IP[0] >= 224 && IP[0] < 240){
ANS[type::D] += 1;
}else{
ANS[type::E] += 1;
}
// 开始 私网IP判断
if ((IP[0] >= 10 && IP[0] < 11) ||
(IP[0] == 172 && IP[1] >= 16 && IP[1] < 32) ||
(IP[0] == 192 && IP[1] == 168))
{
ANS[type::Pirv] += 1;
}
}
cout << ANS[type::A] << " " << ANS[type::B] << " "\
<< ANS[type::C] << " " << ANS[type::D] << " "\
<< ANS[type::E] << " " << ANS[type::Err] << " " \
<< ANS[type::Pirv] << endl;
return 0;
} 
京公网安备 11010502036488号