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