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