直接按规则来就行,主要是要考虑到各种情况。

#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef union __Code_tu {
    uint32_t all;
    uint8_t segment[4];
} Code_tu;

typedef union __IPType_tu {
    uint8_t all;
    struct {
        uint8_t isValid:1;
        uint8_t type:3;
        uint8_t isPrivate:1;
        uint8_t reserved:3;
    } bit;
} IPType_tu;

Code_tu ip = {};
Code_tu mask = {};

IPType_tu checkIP(uint32_t ip)
{
    IPType_tu result = {};

    result.all = 0;
    result.bit.isValid = 1;
    if (ip>=0x01000000 && ip<=0x7EFFFFFF) {
        result.bit.type = 1;
    } else if (ip>=0x80000000 && ip<=0xBFFFFFFF) {
        result.bit.type = 2;
    } else if (ip>=0xC0000000 && ip<=0xDFFFFFFF) {
        result.bit.type = 3;
    } else if (ip>=0xE0000000 && ip<=0xEFFFFFFF) {
        result.bit.type = 4;
    } else if (ip>=0xF0000000 && ip<=0xFFFFFFFF) {
        result.bit.type = 5;
    } else if (ip>=0x00000000 && ip<=0x00FFFFFF) {

    } else if (ip>=0x7F000000 && ip<=0x7FFFFFFF) {
        
    } else {
        result.bit.isValid = 0;
    }

    if ((ip>=0x0A000000 && ip<=0x0AFFFFFF)
        || (ip>=0xAC100000 && ip<=0xAC1FFFFF)
        || (ip>=0xC0A80000 && ip<=0xC0A8FFFF)) {
        result.bit.isPrivate = 1;
    } else {}

    return result;
}

bool checkMask(uint32_t mask)
{
    uint32_t tempMask = 0x80000000;
    bool result = true;
    bool zero = false;

    if (mask==0x0 || mask==0xFFFFFFFF) {
         result = false;
    } else {
        zero = false;
        for (tempMask=0x80000000; tempMask!=0; tempMask>>=1) {
            if ((tempMask&mask) && zero) {
                result = false;
                break;
            } else if ((tempMask&mask) && (!zero)) {
                continue;
            } else {
                zero = true;
            }
        }
    }

    return result;
}

int main() {
    uint32_t A=0,B=0,C=0,D=0,E=0;
    uint32_t err=0,priv=0;
    char s[32] = {};
    bool isValidMask = false;
    bool errFlag = false;
    uint32_t start=0, end=0, length=0;
    uint32_t temp=0, loca=0;
    IPType_tu ipType;

    while (scanf("%s", s) != EOF) {
        length = strlen(s);
        ip.all=0,mask.all=0,loca=0;
        start=0, end=0;
        errFlag = false;
        for (int i=0; i<length; ++i) {
            if ((loca<3 && s[i]=='.')      // IP 前3段
                ||(loca==3 && s[i]=='~')   // IP 第4段
                ||(loca<7 && s[i]=='.')    // 掩码前3段
                ||(loca==7 && i==length-1) // 掩码第4段
            ) {
                if (i == length-1) { end = i; }
                else { end = i-1; }
                if(start > end) {
                    err++;
                    errFlag = true;
                } else {
                    temp = 0;
                    for (int j=start; j<=end; ++j) {
                        temp = temp*10+s[j]-'0';
                    }
                    if (temp > 255) {
                        err++;
                        errFlag = true;
                    } else {
                        if (loca <= 3) {
                            ip.all = (ip.all << 8) + temp;
                        } else {
                            mask.all = (mask.all << 8) + temp;
                        }  
                        start = i+1;
                        loca++;
                    } 
                }
            } else if ((loca==3 && s[i]=='.') || (loca==7 && s[i]=='.')) { // IP 或掩码大于4段
                err++;
                errFlag = true;
            } else {}

            if (errFlag) { break; } else {}
        }

        if (!errFlag) {
            ipType = checkIP(ip.all);
            isValidMask = checkMask(mask.all);

            if (ipType.bit.isValid == 0) {
                err++;
            } else {
                if (ipType.bit.type != 0) {
                    if (isValidMask) {
                        switch (ipType.bit.type) {
                            case 1: A++; break;
                            case 2: B++; break;
                            case 3: C++; break;
                            case 4: D++; break;
                            case 5: E++; break;
                            default: break;
                        }
                        if (ipType.bit.isPrivate == 1) {
                            priv++;
                        } else {}
                    } else {
                        err++;
                    } 
                } else {}
            }
        }
        memset(s, 0, sizeof(char)*length);
    }
    
    printf("%d %d %d %d %d %d %d", A,B,C,D,E,err,priv);
    
    return 0;
}