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

全部评论

相关推荐

点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务