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