题解 | #识别有效的IP地址和掩码并进行分类统计#

识别有效的IP地址和掩码并进行分类统计

https://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682

#include <stdio.h>

enum {A=0,B,C,D,E,ERR,PRIV};

int ifInPrivRange(int *addr)
{
    const unsigned int privaddrs[6][4] = {
        {10,0,0,0},
        {10,255,255,255},
        {172,16,0,0},
        {172,21,255,255}, 
        {192,168,0,0},
        {192,168,255,255}
    };
    long longprivaddrs[6] = {0};
    long longaddr = 0;
    
    for(int j=0; j<4; j++)
    {
        longaddr *= 1000;
        longaddr += addr[j];
    }
    
    for(int i=0; i<6; i+=2)
    {
        for(int j=0; j<4; j++)
        {
            longprivaddrs[i] *= 1000;
            longprivaddrs[i] += privaddrs[i][j];
            longprivaddrs[i+1] *= 1000;
            longprivaddrs[i+1] += privaddrs[i+1][j];
        }
        
        if(longaddr>=longprivaddrs[i] && longaddr<=longprivaddrs[i+1])
            return PRIV;
    }
    
    return -1;
}
int ifInRange(int *addr)
{
    const unsigned int addrs[10][4] = {
        {1,0,0,0},
        {126,255,255,255},
        {128,0,0,0},
        {191,255,255,255},
        {192,0,0,0},
        {223,255,255,255},
        {224,0,0,0},
        {239,255,255,255},
        {240,0,0,0},
        {255,255,255,255}
    };
    
    long longaddrs[10] = {0};
    long longaddr = 0;
    
    for(int j=0; j<4; j++)
    {
        longaddr *= 1000;
        longaddr += addr[j];
    }
    
    for(int i=0; i<10; i+=2)
    {
        for(int j=0; j<4; j++)
        {
            longaddrs[i] *= 1000;
            longaddrs[i] += addrs[i][j];
            longaddrs[i+1] *= 1000;
            longaddrs[i+1] += addrs[i+1][j];
        }
        
        if(longaddr>=longaddrs[i] && longaddr<=longaddrs[i+1])
            return i/2;
    }
    
    return -1;
}
int ifCorMask(int *masks)
{
    int mask = 0;
    int i;
    
    for(i=0; i<4; i++)
    {
        mask <<= 8;
        mask |= masks[i];
    }
    
    for(i=31; i>=0; i--)
    {
        if(!(mask&(0x01<<i)))
            break;
    }
    if(i<0)
        return 0;//全1,错误
    
    for(; i>=0; i--)
    {
        if(mask&(0x01<<i))
            break;
    }
    if(i >= 0)
        return 0;//错误
    return 1;
}

int main()
{
    char str[128];
    char ip[64], mask[64];
    int ips[4], masks[4];
    int ret, ret1;
    char *p;
    int result[7] = {0};
    
    while(scanf("%s", str) != EOF)
    {
        p = strchr(str, '~');
        
        ret1 = sscanf(str, "%d.%d.%d.%d~", &ips[0], &ips[1], &ips[2], &ips[3]);
        if(ips[0]==0 || ips[0]==127)
            continue;
        
        //先判断掩码
        ret = sscanf(p+1, "%d.%d.%d.%d", &masks[0], &masks[1], &masks[2], &masks[3]);
        if(ret!=4 || !ifCorMask(masks))
        {
            result[ERR]++;
            continue;
        }
        
        ret = ret1;
        if(ret != 4)
            result[ERR]++;
        else
        {
            ret = ifInPrivRange(ips);
            if(ret >= 0)
                result[ret]++;
            ret = ifInRange(ips);
            if(ret < 0)
                result[ERR]++;
            else
                result[ret]++;
        }
        
    }
    
    for(int i=0; i<7; i++)
        printf("%d ", result[i]);
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务