题解 | #验证IP地址#
验证IP地址
https://www.nowcoder.com/practice/55fb3c68d08d46119f76ae2df7566880
/** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * 验证IP地址 * @param IP string字符串 一个IP地址字符串 * @return string字符串 */ #include <string.h> #define IsMiddle(max,min,value) (value<=max&&value>=min) enum IPTYPE{InvalidIp=0,Ipv4Type,Ipv6Type}; enum IPTYPE CheckIpCharVaild(char* IP) { int i=0,divcnt=0,len=strlen(IP); char c; char *ipv4=strchr(IP,'.'); char *ipv6=strchr(IP,':'); //字符'.'和':'必须存在一个,且不能两个同时存在 if(len>8*4+7) return InvalidIp; if(ipv4&&ipv6){ return InvalidIp; }else if(ipv4==NULL&&ipv6==NULL) return InvalidIp; //检查字符存在的合法性,比如IPV4不能出现ABCabc字符,ipV6不能出现#%$字符 for(i=0;i<len;i++){ c=IP[i]; if(IsMiddle(0x39,0x30,c)==1) continue; else if(c=='.'||c==':'){ divcnt++;//记录分隔符个数,后面对分隔符个数检查 continue; } else if(ipv6){ if(IsMiddle('F','A',c)==1||IsMiddle('f','a',c)==1) continue; else return InvalidIp; } return InvalidIp; } if((divcnt==3&&ipv4)||(divcnt==7&&ipv6)) //检查分隔符个数是否正确 return (ipv6==NULL? Ipv4Type:Ipv6Type); return InvalidIp; } enum IPTYPE IPVerCheck(char* IP,int type) { struct IPkeyword{ char *div; //分割符号 int divnum; //分割符号个数 int base; //字符串10、16进制 int max; //每个分割字符串最大值 ipv4是255 }tab[3]={{NULL,0,0,0},{".",3,10,255},{":",7,16,0xffff}}; int index=0; char *p; for(index=0;index<=tab[type].divnum;index++){ p=(index==0 ? strtok(IP,tab[type].div) : strtok(NULL,tab[type].div)); if(p==NULL) return InvalidIp; else if(strtol(p,NULL,tab[type].base)>tab[type].max) return InvalidIp; if(strlen(p)>=2&&p[0]==0x30){ if(type==2&&p[1]==0x30) return InvalidIp; if(type==1) return InvalidIp; } } return (enum IPTYPE)type; } char* solve(char* IP ) { // write code here enum IPTYPE type=0; static char IpType[3][12]={{"Neither"},{"IPv4"},{"IPv6"}}; type=CheckIpCharVaild(IP); if(type!=InvalidIp) type= IPVerCheck(IP,(unsigned int)type); return &IpType[(unsigned int)type][0]; }