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

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

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

# include <stdio.h>
# include <string.h>
# include <stdbool.h>
# define SIZE 32

// 判断掩码是否正确,正确为1,错误为0
int MaskJudgment(char* st, int len);
// 返回 0 错误,1 A, 2 B  3 C  4 D  5 E   6 无效  7 私有
int IpsJudgment(char *st, int len);
// 返回 0 错误,1 A, 2 B  3 C  4 D  5 E   6 无效  7 私有
int IpFrist(int hard, int scond);
int pows(int n, int k);
int main(void){
    int iptag[7] = {0}; // 0~4: A,B,C,D,E. 5:错误, 6,私有
    int temp;
    char str[SIZE], ips[SIZE], mask[SIZE];
    while(scanf("%s", str) != EOF){
        int i = 0;
        // 将str拆分为 Ip 和 mask
        while(str[i] != '~'){
            ips[i] = str[i];
            i++;
        }
        ips[i] = '\0';
        temp = i + 1;
        i = 0;
        while(str[temp + i]){
            mask[i] = str[temp + i];
            i++;
        }
        mask[i] = '\0';
        // 判断
        int ip = IpsJudgment(ips, strlen(ips));
        int ms = MaskJudgment(mask, strlen(mask));
        if(ip == 6);// 无效ip 不做处理,
        else if(ip == 0) iptag[5]++; // IP输入错误
        else if(ip == 1)// A 类地址
            if(!ms) iptag[5]++;    // 掩码输入错误
            else iptag[0]++;
        else if(ip == 2)// B 类地址
            if(!ms) iptag[5]++;
            else iptag[1]++;
        else if(ip == 3)// C 类地址
            if(!ms) iptag[5]++;
            else iptag[2]++;
        else if(ip == 4)// D 类地址
            if(!ms) iptag[5]++;
            else iptag[3]++;
        else if(ip == 5) // E 类地址
            if(!ms) iptag[5]++;
            else iptag[4]++;
        else if(ip == 7) // 私有ip, 172无效地址中的私有地址
            if(!ms) iptag[5]++;
            else iptag[6]++;
        else if(ip == 17) // 10网段,A + 私
            if(!ms) iptag[5]++;
            else {
                iptag[0]++;
                iptag[6]++;
            }
        else if(ip == 37)// 192网段 C + 私
            if(!ms) iptag[5]++;
            else {
                iptag[2]++;
                iptag[6]++;
            }
    }
    // 输出
    for(int i = 0; i < 7; i++)
        printf("%d ",iptag[i]);
    return 0;
}

// 返回 0 错误,1 A, 2 B  3 C  4 D  5 E   6 无效  7 私有
int IpsJudgment(char* st, int len){
    int num, hard = -1, scond, mark = 0;
    for(int i = 0; i < len; i++){
        num = 0;
        int t = 0;
        while(*(st + i) != '.' && i != len){
            num = num * 10 + (*(st + i) - '0');
            i++;
            t = 1;// 用于判断输入是否为空
        }
        if(mark != -1) mark++;
        if(hard == -1) hard = num;
        if(mark == 2) scond = num;
        if(num > 255 || t == 0) mark = -1;
    }
    int s = IpFrist(hard, scond);
    if(s == 6) return 6;
    else if(mark == -1) return 0;
    else return s;
}
// 返回 0 错误,1 A, 2 B  3 C  4 D  5 E   6 无效  7 私有
int IpFrist(int hard, int scond){
    if(hard == 0) return 6;
    else if(hard >= 1 && hard < 127){
        if(hard == 10) return 17;
        else return 1;
    }
    else if(hard == 127){
        if(scond >= 16 && scond < 32) return 7;
        else return 6;
    }
    else if(hard >= 128 && hard < 192) return 2;
    else if(hard >= 192 && hard < 224) {
        if(hard == 192 && scond == 168) return 37;
        else return 3;
    }
    else if(hard >= 224 && hard < 240) return 4;
    else if(hard >= 240 && hard < 255) return 5;
    else return 0;
}

int MaskJudgment(char* st, int len){
    int mark = 0;
    int num;
    if(*st == 0) return 0;
    for(int i = len - 1; i >= 0; i--){
        num = 0;
        int tag = 0;
        while(*(st + i) != '.' && i >= 0){
            num += (*(st + i) - '0') * pows(10,tag);
            tag++;
            i--;
        }
        int size = 8;
        while(size--){
            if(!(num & 01) && mark != 0) return 0;
            if(num & 01 == 1) mark++;// 
            num >>= 1;
        }
    }
    if(mark == 32) return 0;// 255.255.255.255的情况
    else return 1;
}

int pows(int n, int k){
    int num = 1;
    for(int i = 0; i < k; i++) num *= n;
    return num;
}
全部评论

相关推荐

点赞 评论 收藏
分享
昨天 00:11
已编辑
广东工业大学 算法工程师
避雷深圳&nbsp;&nbsp;yidao,试用期&nbsp;6&nbsp;个月。好嘛,试用期还没结束,就直接告诉你尽快找下一家吧,我谢谢您嘞
牛客75408465号:笑死,直属领导和 hr 口径都没统一,各自说了一些离谱的被裁理由,你们能不能认真一点呀,哈哈哈哈哈😅😅😅
点赞 评论 收藏
分享
11-15 17:19
湖南大学 Java
成果成果成果果:这是哪个公司的hr,这么离谱吗,我没见过用性别卡技术岗的,身边女性同学拿大厂offer的比比皆是
点赞 评论 收藏
分享
2 收藏 评论
分享
牛客网
牛客企业服务