题解 | #验证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 i=0,len=strlen(IP);
char c;
char *ipv4=strchr(IP,'.');
char *ipv6=strchr(IP,':');
//字符'.'和':'必须存在一个,且不能两个同时存在
if(ipv4&&ipv6){
return 0;
}else if(ipv4==NULL&&ipv6==NULL)
return 0;
printf("45667 \n");
//检查字符存在的合法性,比如IPV4不能出现ABCabc字符,ipV6不能出现#%$字符
for(i=0;i<len;i++){
c=IP[i];
if(IsMiddle(0x39,0x30,c)==1)
continue;
else if(c=='.'||c==':')
continue;
else if(ipv6){
if(IsMiddle('F','A',c)==1||IsMiddle('f','a',c)==1)
continue;
else
return 0;
}
else
return 0;
}
return (ipv6==NULL? 1:2);
}
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; //字符串10、16进制
int max; //每个分割字符串最大值 ipv4是255
}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);
//printf("type=%d \n",type);
type=IPvCheck(IP,type);
return &IpType[type][0];
}
