总体思路
将每一行中的IP地址,子网掩码提取出来,每个点分十进制数提取出来,通过字符转整数转换成整数,将整数作为一个元素压入到IP vector和MASK vector中,在对IP和MASK逐个进行判断。
IP 只需要判断是否小于0或者大于255,如果是,直接归入错误类,继续下一个字符串的判断
对于IP第一位,如果是0 或者127 直接跳过,继续下一个字符串的判断
剩下的判断是A,B,C,D,E中的哪一类。
MASK 判断MASK是否大于255或小于0
整个MASK是否都是由255或者0组成,如果是,直接归入错误类,继续下一个字符串的判断
对于MASK是由是由特定的几个数构成,因为要求二进制前面的都是1,后面的都是0,仅仅只能够有8位数字满足要求,不是这8位数组成的一律排除。
从MASK的第1位(0 是起始)开始,判断本位是否为0,若不是,前面一位必须是255,满足子网掩码二进制数都是前面是1,后面是0.
代码
#include<iostream>
#include<sstream>
#include<cmath>
#include<vector>
using namespace std;
int string2int(string s) {
int res = 0;
int num = s.size();
if (num == 0)
return -1;
for (int i = 0; i < s.size(); ++i) {
res += (s[i] - '0') * pow(10, --num);
}
return res;
}
int main() {
string line;
int AIP = 0, BIP = 0, CIP = 0, DIP = 0, EIP = 0, error = 0, privateIP = 0;
while (getline(cin, line)) { // 读取IP地址和子网掩码
vector<int> IP, MASK;
string s;
istringstream is(line);
bool isIP = true;
while (getline(is, s, '~')) { // 先后取出IP和子网掩码
string num;
istringstream iss(s);
if (isIP) { // 对于IP的处理
while (getline(iss, num, '.')) {
int IP_num = string2int(num);
IP.push_back(IP_num);
}
isIP = !isIP;
} else {
while (getline(iss, num, '.')) {
int MASK_num = string2int(num);
MASK.push_back(MASK_num);
}
isIP = !isIP;
}
}
// IP和掩码都获取完毕,开始判断
// 判断IP是否合法
if(IP[0] == 0 || IP[0] == 127)
continue;
int i = 0;
for (; i < 4; ++i) {
if (IP[i] > 255 || IP[i] < 0 || (IP[i] == 0 && i == 0)) {
++error;
break;
}
}
if(i < 4) // IP有误,直接归类到不合法地址
continue;
// 判断MASK是否合法
i = 0;
if((MASK[0] == 255 && MASK[1] == 255 && MASK[2] == 255 && MASK[3] == 255) || (MASK[0] == 0 && MASK[1] == 0 && MASK[2] == 0 && MASK[3] == 0)){
++error;
continue;
}
for (; i < 4; ++i) {
if (MASK[i] != 255 && MASK[i] != 254 && MASK[i] != 252 && MASK[i] != 248 &&
MASK[i] != 240 && MASK[i] !=224 && MASK[i] !=192 && MASK[i] != 128 && MASK[i] != 0) {
break;
}
if (i >= 1 && (MASK[i - 1] != 255 && MASK[i] != 0)) {
break;
}
}
if(i < 4){ // MASK有误,直接归类到不合法地址
++error;
continue;
}
if (IP[0] == 10 || (IP[0] == 172 && (IP[1] >= 16 && IP[1] <= 31)) ||
(IP[0] == 192 && IP[1] == 168)) // 判断是不是私有IP
++privateIP;
if (i == 4) { // IP 地址合法
if (IP[0] >= 1 && IP[0] <= 126) // 判断属于哪一类IP
++AIP;
else if (IP[0] >= 128 && IP[0] <= 191)
++BIP;
else if (IP[0] >= 192 && IP[0] <= 223)
++CIP;
else if (IP[0] >= 224 && IP[0] <= 239)
++DIP;
else if (IP[0] >= 240 && IP[0] <= 255)
++EIP;
}
}
cout << AIP << ' ' << BIP << ' ' << CIP << ' ' << DIP << ' ' << EIP << ' ' << error << ' ' << privateIP;
return 0;
}



京公网安备 11010502036488号