アイデア:
最初にエラー処理を実行してから、統計を分類します。
タイトル説明
分類と識別のために、IPアドレスと対応するマスクを解決してください。クラスA / B / C / D / Eに従ってアドレスを分類する必要があり、不正なアドレスとマスクは別々に分類されます。
すべてのIPアドレスは、A、B、C、D、およびEの5つのカテゴリに分類されます。
クラスAアドレス1.0.0.0〜126.255.255.255;
クラスBアドレス128.0.0.0〜191.255.255.255;
クラスCアドレス192.0.0.0〜223.255.255.255;
クラスDアドレス224.0.0.0〜239.255.255.255;
クラスEアドレス240.0.0.0〜255.255.255.255
プライベートネットワークのIP範囲は次のとおりです。
10.0.0.0〜10.255.255.255
172.16.0.0〜172.31.255.255
192.168.0.0〜192.168.255.255
サブネットマスクはバイナリで、前面は連続した1で、その後すべて0です。(例:255.255.255.32は不正なマスクです)
バイナリのすべての1またはすべての0は違法であることに注意してください
注意:
1. [0。*。*。*]および[127。*。*。*]に類似したIPアドレスは、上記の入力タイプのいずれにも属さず、不正なIPアドレスでもないため、カウント時に無視できます。
2.プライベートIPアドレスは、A、B、C、D、およびEアドレスと競合しません
説明を入力してください:
複数行の文字列。〜で区切られた、行ごとに1つのIPアドレスとマスク。
出力の説明:
A、B、C、D、E、間違ったIPアドレスまたは間違ったマスク、およびプライベートIPの数をスペースで区切って数えます。
例1
入る
10.70.44.68~255.254.255.0
1.0.0.1~255.0.0.0
192.168.0.2~255.255.255.0
19..0.~255.255.255.0
出力
1 0 1 0 0 2 1
例:
#include<iostream>
#include<cstring>
using namespace std;
enum {
A, B, C, D, E, ERR, PRIVATE,
};
int main()
{
char str[64];
int count[7];
for(int i = 0; i < 7; i++) count[i] = 0;
while(cin.getline(str, 64)) {
int addr[4];
char *p = str;
char *begin = p;
bool err = false;
for(int i = 0; i < 4; i++) {
while(isdigit(*p)) {
p++;
}
if(*begin == '.' || *p == '\0') {
err = true;
break;
}
*p = '\0';
char *ptr;
addr[i] = strtod(begin, &ptr);
begin = ++p;
}
if(err) {
count[ERR]++;
continue;
}
p = begin;
int mask[4];
for(int i = 0; i < 4; i++) {
while(isdigit(*p)) {
p++;
}
if(*begin == '.') {
err = true;
break;
}
*p = '\0';
char *ptr;
mask[i] = strtod(begin, &ptr);
begin = ++p;
}
if(err) {
count[ERR]++;
continue;
}
int MASK = (mask[0]<<24)+(mask[1]<<16)+(mask[2]<<8)+(mask[3]);
if(MASK != 0 && MASK != 0xFFFFFFFF) {
for(int i = 0; i < 32; i++) {
if(!(MASK & 0x80000000)) {
if(MASK != 0) {
err = true;
break;
}
}
MASK <<= 1;
}
} else {
err = true;
}
if(err) {
count[ERR]++;
continue;
} else {
if(addr[0] == 0|| addr[0] == 127) continue;
else {
if(addr[0] >= 1 && addr[0] <= 126) {
count[A]++;
if(addr[0]==10) {
count[PRIVATE]++;
}
} else if(addr[0] >= 128 && addr[0] <= 191) {
count[B]++;
if(addr[0]==172 && (addr[1]>=16 && addr[1]<=31)) {
count[PRIVATE]++;
}
} else if(addr[0] >= 192 && addr[0] <= 223) {
count[C]++;
if(addr[0]==192 && addr[1]==168) {
count[PRIVATE]++;
}
} else if(addr[0] >= 224 && addr[0] <= 239) {
count[D]++;
} else if(addr[0] >= 240 && addr[0] <= 255) {
count[E]++;
}
}
}
}
for(int i = 0; i < 7; i++) cout << (i == 0 ? "" : " ") << count[i];
}