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