重点应该是掩码的计算上,供参考。

#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;
}