HJ 18有効なIPアドレスとマスクを特定し、分類統計を実行します

アイデア:

最初にエラー処理を実行してから、統計を分類します。

タイトル説明

分類と識別のために、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];
}

 

おすすめ

転載: blog.csdn.net/u012571715/article/details/114963197