题解 | #验证IP地址#
验证IP地址
https://www.nowcoder.com/practice/55fb3c68d08d46119f76ae2df7566880
C语言
#define PROTOCOL_NEITHER 0 //协议类型
#define PROTOCOL_IPV4 1
#define PROTOCOL_IPV6 2
int isVaildChar(char c){ //判断是否有效字符
if(c >= 'A' && c <='F')
return 0;
if(c >= 'a' && c <='f')
return 0;
if(c >= '0' && c <='9')
return 0;
return -1; //无效字符则返回-1
}
int IsProtocalIPV4(char *IP){
char *tmpIp = IP;
int sectorNum = 0; //用于存储每一段字符的十进制值
int sector = 0; //用于存储输入的IP有多少段
do{ //do while才能判断到结束符
if(*tmpIp == '.' || *tmpIp == '\0'){ //完成一小段的字符获取后,进入判断,是否到末尾以及该段字符是否合法。
if(sectorNum > 255) return -1; //如果该段字符十进制大于255,非法
sectorNum = 0; //该段字符合法 , 清空sectorNum,为下段字符做准备
sector++; //IP段+1
if(*tmpIp == '\0') break; //如果已经到达末尾,则跳出循环。
tmpIp++; //跳过.
}
if(*tmpIp >= '0' && *tmpIp <= '9'){ //判断字符是否为数字
if(sectorNum == 0 && *tmpIp == '0' && *(tmpIp+1) != '.')return -1; //ipv4中每一段开头不能为0,否则非法
sectorNum *= 10; //正常字符以十进制存放在sectorNum
sectorNum += (*tmpIp - '0');
}else{ //异常字符则退出函数
return -1;
}
}while(*tmpIp++ != '\0');
if(sector != 4) //判断是否有4段,多或少都为非法
return -1;
return 0;
}
int IsProtocalIPV6(char *IP){
char *tmpIp = IP;
int sectorCount = 0; //小段的字符数量,注意这里和v4不一样
int sector = 0; //用于存储输入的IP有多少段
do{
if(*tmpIp == ':' || *tmpIp == '\0'){
if(sectorCount == 0 || sectorCount > 4) return -1; //小段的字符数量为0或者大于4都是非法
sectorCount = 0; //清空小段字符数量,为下一次做准备
sector++; //段+1
if(*tmpIp == '\0') break; //如果已经到达末尾,则跳出循环
tmpIp++; //跳过:
}
if(isVaildChar(*tmpIp) == 0){ //判断字符是否为合法:0-9 a-f A-F
sectorCount++;
}else{ //异常字符则退出函数
return -1;
}
}while(*tmpIp++ != '\0');
if(sector != 8) //判断是否有8段,多或少都为非法
return -1;
return 0;
}
char* solve(char* IP ) {
// write code here
char *tmpIp = IP;
char *ret = (char*)malloc(sizeof(char)*10); //给返回值申请空间
ret = "Neither";
int flag_process = PROTOCOL_NEITHER; //设置协议的默认值
while(*tmpIp != '\0'){ //根据. :来区分是使用v4 v6的协议
if(*tmpIp == '.'){
flag_process = PROTOCOL_IPV4;
break;
}
if(*tmpIp == ':'){
flag_process = PROTOCOL_IPV6;
break;
}
tmpIp++;
}
if(flag_process == PROTOCOL_IPV4){ //Ipv4解析
if(IsProtocalIPV4(IP) == 0){ //如果校验完成则设置返回值ret为IPv4
ret = "IPv4";
}
}else if(flag_process == PROTOCOL_IPV6){ //Ipv6解析
if(IsProtocalIPV6(IP) == 0){
ret = "IPv6";
}
}
return ret;
}