题解 | #验证IP地址#
验证IP地址
https://www.nowcoder.com/practice/55fb3c68d08d46119f76ae2df7566880
/**
* 验证IP地址
* @param IP string字符串 一个IP地址字符串
* @return string字符串
*/
char* solve(char* IP ) {
// write code here
//指针数组用于存放拆分后的子串
char *ipv4[4];
char *ipv6[8];
//*p用于遍历
char *p=IP;
//flag用于判断.或:的个数,判断是ipv还是ipv6
int flag=0;
//strtok的参数不能是指针,应该是字符数组
char temp[50]={0};
strcpy(temp,IP);
//判断是IPV4还是IPV6,因为要么是.要么是:所以可以只用flag不然应该定义两个变量
while(*p)
{
if( '.'==*p )
{
flag++;
}
else if(':'==*p)
{
flag++;
}
p++;
}
//重新将p指向IP,对字符串进行逐个判断
p=IP;
while (*p)
{
//对ipv6地址中的非十六进制内的字符进行判断
if( (7==flag) && ( (*p>='g'&&*p<='z') || (*p>='G'&&*p<='Z') ) )
{
printf("1");
return "Neither";
}
//判断ipv4中有无出现字母
else if( (3==flag) && ( (*p>='a'&&*p<='z') || (*p>='A'&&*p<='Z') ) )
{
printf("2");
return "Neither";
}
p++;
}
int i=0;
if(3==flag)
{
//使用strtok函数对ipv4字符串进行拆分
char *token=strtok(temp,".");
while(token!=NULL)
{
ipv4[i]=token;
i++;
token=strtok(NULL,".");
}
//判断是否出现..的情况,如果有i会小于4
if (i<4)
return "Neither";
//必须先判断i的情况,否则当128.124..1时,ipv4[i]会出现段错误
for(i=0;i<4;i++)
{
//判断在拆分的子串中是否有01等情况,即字串长度大于1,0开头不合法
if(strlen(ipv4[i])>1 && 0==strncmp(ipv4[i],"0", 1))
return "Neither";
//使用atoi函数判断是否拆分子串数字是否合法
else if( ( atoi(ipv4[i] )>255 || ( atoi(ipv4[i])<0 ) ) )
return "Neither";
}
return "IPv4";
}
else if (7==flag)
{
char *token=strtok(temp,":");
while(token!=NULL)
{
ipv6[i]=token;
i++;
token=strtok(NULL,":");
}
if (i<8)
{
return "Neither";
}
for(i=0;i<8;i++)
{
//因为不能像ipv4一样通过atoi来判断数值是否合理,所以判断拆分子串的长度
if(strlen(ipv6[i])<1 || strlen(ipv6[i])>4)
return "Neither";
}
return "IPv6";
}
return "Neither";
}

查看7道真题和解析