题解 | #判断两个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;
}
