判断两个ip是否属于统一子网--c语言题解

判断两个IP是否属于同一子网

http://www.nowcoder.com/questionTerminal/34a597ee15eb4fa2b956f4c595f03218

这道题,不难,配不上较难这个符号,没有复杂的算法问题
1、把子网掩码和ip的每一段数字分别取出来,判断是否小于255,不是则非法。判断ip是否为4位,大于小于都非法
2、得出子网掩码和ip对应的二进制的数据,判断是否为0,为0也非法。
3、判断子网掩码是否合法(前面为1,后面为0,且不能全部为1)
4、判断ip分别和子网掩码取&后,是否相等,不等则不在同一个网络,相等则在同一个网络
代码如下:

//若IP地址或子网掩码格式非法则输出1,若IP1与IP2属于同一子网络输出0,若IP1与IP2不属于同一子网络输出2。
#include<stdio.h>
#include<string.h>
int judge(char* yanma,char* ip1,char* ip2){
    unsigned int l=0,m=0,n=0;
    int str_yanma[4] = {0},str1[4]={0},str2[4] = {0},j=0;
    int len = strlen(yanma), len1=strlen(ip1),len2=strlen(ip2);
    for(int i = 0;i<len;i++){
        if(yanma[i] >= '0' && yanma[i] <= '9'){
            if(j >= 4 ) return 1;//若IP地址或子网掩码格式非法则输出1
            str_yanma[j] = str_yanma[j]*10 + yanma[i] - '0';
            if(str_yanma[j] > 255) return 1;//若IP地址或子网掩码格式非法则输出1
        }else{
            j++;
        }
    }
    if(j < 3) return 1;

    //判断掩码是否合法
    l = str_yanma[0] << 24 | str_yanma[1] << 16 | str_yanma[2] << 8 | str_yanma[3];
    if(l == 0xffffffff || l==0) return 1;
    int x = l^0xffffffff;
    if((x+1)&x) return 1;//子网掩码前面是1,后面是0

    //开始计算ip的值
    j=0;
    for(int i = 0;i<len1;i++){
        if(ip1[i] >= '0' && ip1[i] <= '9'){
            if(j >= 4 ) {
                return 1;//若IP地址或子网掩码格式非法则输出1
            }
            str1[j] = str1[j]*10 + ip1[i] - '0';
            if(str1[j] > 255) {
                return 1;//若IP地址或子网掩码格式非法则输出1
            }
        }else{
            j++;
        }
    }
    if(j < 3) return 1;
    m = str1[0] << 24 | str1[1] << 16 | str1[2] << 8 | str1[3];

    j=0;
    for(int i = 0;i<len2;i++){
        if(ip2[i] >= '0' && ip2[i] <= '9'){
            if(j >= 4 ) return 1;//若IP地址或子网掩码格式非法则输出1
            str2[j] = str2[j]*10 + ip2[i] - '0';
            if(str2[j] > 255) return 1;//若IP地址或子网掩码格式非法则输出1
        }else{
            j++;
        }
    }
    if(j < 3) return 1;
    n = str2[0] << 24 | str2[1] << 16 | str2[2] << 8 | str2[3];

    if(m==0 || n==0) return 1;

    if( (m&l) != (n&l) ) return 2;

    return 0;
}
int main(void){
    char yanma[50] = {0};
    while(scanf("%s",yanma)!=EOF){
        char ip1[50]={0},ip2[50]={0};
        scanf("%s\n%s",ip1,ip2);
        int res = judge(yanma, ip1, ip2);
        printf("%d\n",res);
    }
    return 0;
}
全部评论

相关推荐

06-11 13:34
门头沟学院 C++
offe从四面八方来:我真的没时间陪你闹了
点赞 评论 收藏
分享
家人们,我现在真的好纠结。我是26届的,目前还没有实习过。我现在的情况是,想参加秋招,但是感觉自己的简历特别空,没有实习经历会不会秋招直接凉凉啊?可我又听说现在很多公司对26届实习生也不太感冒,说什么不确定性大。而且我最近在准备考公,时间上也有点冲突。要是把时间花在实习上,备考时间就少了。但要是不实习,又怕以后就业有问题😫有没有懂行的友友帮我分析分析:26届现在不实习,秋招找工作真的会很难吗?考公和实习该怎么平衡啊?如果现在不实习,考完公再去找实习还来得及吗?真的太焦虑了,希望大家能给我点建议🙏
小破站_程序员YT:我可能和大家的观点不一样。人的精力是有限的,不能既要还要。你又想实习又想考公最后又要秋招上岸,我觉得哪有那么多的选择。你如果想考上岸,那就全力以赴。如果想秋招上岸,就继续投实习,投没了,就继续准备秋招,秋招不行继续春招。别到最后,考公没上岸,觉得是花了时间浪费在找实习上了, 秋招没上岸,觉得是浪费时间准备考公去了。我是认为很难说可以去平衡 不喜勿喷,可以叫我删除
点赞 评论 收藏
分享
评论
点赞
3
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务