在牛客上刷到”识别有效的IP地址和掩码并进行分类统计“这道题,现在将通过的代码贴一下,供大家参考。
请解析IP地址和对应的掩码,进行分类识别。要求按照A/B/C/D/E类地址归类,不合法的地址和掩码单独归类。
所有的IP地址划分为 A,B,C,D,E五类
A类地址1.0.0.0~126.255.255.255;
B类地址128.0.0.0~191.255.255.255;
C类地址192.0.0.0~223.255.255.255;
D类地址224.0.0.0~239.255.255.255;
E类地址240.0.0.0~255.255.255.255
私网IP范围是:
10.0.0.0~10.255.255.255
172.16.0.0~172.31.255.255
192.168.0.0~192.168.255.255
子网掩码为二进制下前面是连续的1,然后全是0。(例如:255.255.255.32就是一个非法的掩码)
注意二进制下全是1或者全是0均为非法
注意:
1. 类似于【0.*.*.*】和【127.*.*.*】的IP地址不属于上述输入的任意一类,也不属于不合法ip地址,计数时可以忽略
2. 私有IP地址和A,B,C,D,E类地址是不冲突的
#include <stdio.h> #include <string.h> void ip2num(char* str,int* ip) { memset(ip,0,sizeof(int)*4); int i,j; i=j=0; for(;i<4;++i){ for(;str[j]!='.'&&str[j];++j){ ip[i]=ip[i]*10+str[j]-'0'; } ++j; } return; } void get_ip_mask(char* str, char* ip, char* mask) { char *t=strchr(str,'~'); *t=0; strcpy(ip,str); strcpy(mask,t+1); return; } int checkChar(char* ip) { int len=strlen(ip); if(len<7) return 0; for(int i=0;i<len;++i) if(!((ip[i]>='0'&&ip[i]<='9')||ip[i]=='.')){ return 0; } int n=0; for(int i=0;i<len;++i) if(ip[i]=='.') ++n; if(n!=3) return 0; for(int i=0;i<len;++i) if(ip[i]==';'&&ip[i+1]==';') return 0; return 1; } int checkIP(char* ip) { int ret=0; if(!checkChar(ip)){ return 0; } int ip_num[4]; memset(ip_num,0,sizeof(int)*4); ip2num(ip,ip_num); for(int i=0;i<4;++i) if(ip_num[i]>255) return 0; if(ip_num[0]==127) return -1; if(ip_num[0]==0) return -1; if(ip_num[0]<=126) ret=1; else if(ip_num[0]>=128&&ip_num[0]<=191) ret=2; else if(ip_num[0]>=192&&ip_num[0]<=223) ret=3; else if(ip_num[0]>=224&&ip_num[0]<=239) ret=4; else ret=5; if(ip_num[0]==10||(ip_num[0]==172&&ip_num[1]>=16&&ip_num[1]<=31)||(ip_num[0]==192&&ip_num[1]==168)) ret+=5; return ret; } int checkMask(char* mask) { if(!checkChar(mask)) return 0; int mask_num[4]; ip2num(mask,mask_num); for(int i=0;i<4;++i) if(mask_num[i]>255) return 0; unsigned int mask_int; char* tmp_int=(char*)&mask_int; char* tmp_arr; for(int i=0;i<4;++i){ tmp_arr=(char*)&mask_num[3-i]; tmp_int[i]=tmp_arr[0]; } int tmp=mask_int; while(mask_int&&!(mask_int&1)) mask_int>>=1; if(tmp==mask_int) return 0; while(mask_int){ if((mask_int&1)==0) return 0; mask_int=mask_int>>1; } return 1; } int main() { char str[100]; int a,b,c,d,e,err,prv; a=b=c=d=e=err=prv=0; while(gets(str)!=NULL){ char ip[50],mask[50]; memset(ip,0,50); memset(mask,0,50); get_ip_mask(str,ip,mask); int class=checkIP(ip); if(!class){ ++err; continue; } if(!checkMask(mask)){ ++err; continue; } if(class>5){ ++prv; class-=5; } switch(class){ case 1: ++a; break; case 2: ++b; break; case 3: ++c; break; case 4: ++d; break; case 5: ++e; break; default: break; } } printf("%d %d %d %d %d %d %d\n",a,b,c,d,e,err,prv); }