判断两个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;
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
09-30 19:49
起名星人:蛮离谱的,直接要求转投销售
投递汇川技术等公司10个岗位
点赞 评论 收藏
分享
斑驳不同:还为啥暴躁 假的不骂你骂谁啊
点赞 评论 收藏
分享
点赞 3 评论
分享
牛客网
牛客企业服务