题解 | #验证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];
}
