题解 | #验证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) int CheckCharVaild(char* IP) { int ret=0,flag=0,i=0,len=strlen(IP); char c; while(i<len){ c=IP[i]; i++; if(IsMiddle(0x39,0x30,c)==1) continue; else if(IsMiddle('F','A',c)==1){ flag=1; continue; } else if(IsMiddle('f','a',c)==1){ flag=1; continue; } if(c=='.'&&flag==0) { if(ret==2){ ret=0; break; } ret=1; }else if(c==':'){ if(ret==1){ ret=0; break; } ret=2; }else{ ret=0; break; } } return ret; } int GetStrCnt(char* str,char value){ int len=0; char *p=str; while(1){ p=strchr(p,value); if(p) len++; else break; p++; } return len; } int IPvCheck(char* IP,int type) { struct IPkeyword{ char *div; char divnum; int base; int max; }key[3]={{NULL,0,0,0},{".",3,10,255},{":",7,16,0xffff}}; int index=0; char *p; char*div =key[type].div; char divnum=key[type].divnum; int base =key[type].base; int max =key[type].max; if(type==0) return 0; if(GetStrCnt(IP,*div)!=divnum) return 0; for(index=0;index<=divnum;index++){ p=(index==0 ? strtok(IP,div) : strtok(NULL,div)); if(p==NULL) return 0; else if(strtol(p,NULL,base)>max) return 0; if(strlen(p)>=2&&p[0]==0x30){ if(type==2&&p[1]==0x30) return 0; if(type==1) return 0; } } return type; } char* solve(char* IP ) { // write code here int type=0; static char IpType[3][12]={{"Neither"},{"IPv4"},{"IPv6"}}; type=CheckCharVaild(IP); type=IPvCheck(IP,type); return &IpType[type][0]; }