题解 | #判断两个IP是否属于同一子网#

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

https://www.nowcoder.com/practice/34a597ee15eb4fa2b956f4c595f03218

#include <stdio.h>
#include <string.h>
int is_mash_right(char* str)
{
    int len = strlen(str);
    int num = -1;
    int index = 1;//用来判断255是否连续
    int index1 = 1;//用来判断上一个数是255还是其他
    for(int i = 0;i <= len;i++)
    {
        if(str[i] >= '0'&& str[i] <='9')
        {
            if(num < 0)
                num = str[i]-'0';
            else
                num = num*10+str[i]-'0';
        }
        else if(str[i] == '.' || str[i] == '\0')
        {
            //printf("num = %d\n",num);
            if(num == 255|| num == 254|| num == 252|| num == 248|| num == 240
                || num == 224|| num == 192|| num == 128)
            {
                if(index == 0)
                    return 0;//上一个是0,表示出现255.0.255.0的情况
                //如何表示之前的数
                if(num == 255 && index1 == 0)
                {
                    return 0;
                }
                else if(num != 255)
                {
                    index1 = 0;
                }

                index = 1;
            }
            else if(num == 0)
            {
                index = 0;

            }
            else {
                return 0;//表示.出现在第一个或者出现255和0之外的数
            }
                
            num = -1;
        }
        else {
            return 0;//表示.出现其他字符
        }

    }
    return 1;

}
int is_ip_right(char* str)
{
    int len = strlen(str);
    str[len] = '\0';
    int num = -1;
    for(int i = 0;i <= len;i++)
    {
        if(str[i] >= '0'&& str[i] <='9')
        {
            if(num < 0)
                num = str[i]-'0';
            else
                num = num*10+str[i]-'0';
        }
        else if(str[i] == '.' || str[i] == '\0')
        {
            //printf("num = %d\n",num);
            if(num > 255|| num < 0)
            {
                return 0;//表示.出现在第一个或者出现255和0之外的数
            }
            num = -1;
        }
        else {
            return 0;//表示.出现其他字符
        }
        

    }
    return 1;
}
int main() {
    char str_mash[20];
    char str_ip1[20],str_ip2[20];

    while (scanf("%s\n%s\n%s\n", str_mash, str_ip1,str_ip2) != EOF) { // 注意 while 处理多个 case
        /*
        思路
            1.判断格式是否正确
                判断子网掩码
                判断ip地址
            2.设计算法得到子网号
                使用大小为4的整形数组
                整数之间进行与运算,把结果存到新数组中表示子网号
            3.依次比较两个子网数组是否相同
        */
        int ans1 = is_mash_right(str_mash);
        int ans2 = is_ip_right(str_ip1);
        int ans3 = is_ip_right(str_ip2);
        //printf("%d %d %d\n",ans1,ans2,ans3);
        if(!ans1 || !ans2 || !ans3)
        {
            printf("1\n");//不合法
            continue;
        }
        //将字符转为数字,存到数组中
        int arr_mash[4] = {0};
        int arr_ip1[4] = {0};
        int arr_ip2[4] = {0};
        int len1 = strlen(str_mash);
        str_mash[len1] = '\0';
        int len2 = strlen(str_ip1);
        str_ip1[len2] = '\0';
        int len3 = strlen(str_ip2);
        str_ip2[len3] = '\0';
        int i,j,num = 0;
        for(i = 0,j = 0;i <= len1;i++)
        {
            if(str_mash[i]>='0' && str_mash[i]<='9')
            {
                num = num*10+str_mash[i]-'0';
            }
            else if(str_mash[i] == '.' || str_mash[i] == '\0')
            {
                arr_mash[j] = num;
                j++;
                num = 0;
            }
        }
        for(i = 0,j = 0;i <= len2;i++)
        {
            if(str_ip1[i]>='0' && str_ip1[i]<='9')
            {
                num = num*10+str_ip1[i]-'0';
            }
            else if(str_ip1[i] == '.' || str_ip1[i] == '\0')
            {
                arr_ip1[j] = num;
                j++;
                num = 0;
            }
        }
        for(i = 0,j = 0;i <= len3;i++)
        {
            if(str_ip2[i]>='0' && str_ip2[i]<='9')
            {
                num = num*10+str_ip2[i]-'0';
            }
            else if(str_ip2[i] == '.' || str_ip2[i] == '\0')
            {
                arr_ip2[j] = num;
                j++;
                num = 0;
            }
        }
        /*
        for(i = 0;i < 4;i++)
        {
            printf("mash = %d ip1 = %d ip2 = %d\n",arr_mash[i],arr_ip1[i],arr_ip2[i]);
        }*/
        //进行与运算,得出结果
        //int arr_ans1[4];
        //int arr_ans2[4];
        int index1 = 0,index2 = 0;
        int index_ans = 0;
        for(i = 0;i < 4;i++)
        {
            //arr_ans1[i] = arr_mash[i] & arr_ip1[i];
            //arr_ans2[i] = arr_mash[i] & arr_ip2[i];
            index1 =arr_mash[i] & arr_ip1[i];
            index2 =arr_mash[i] & arr_ip2[i];
            if(index1 != index2)
            {
                index_ans = 1;
                break;
            }
        }
        if(index_ans == 1)
            printf("2\n");
        else
            printf("0\n");
    }
    return 0;
}

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务