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

全部评论
可读性最强代码
点赞 回复 分享
发布于 2024-02-29 19:54 湖北

相关推荐

为啥美团有的笔试可以AI做题啊。。。。我们怎么就不行
碧海蓝涛:因为ai也做不出来
投递美团等公司10个岗位
点赞 评论 收藏
分享
程序员小白条:这比例牛逼,750:1
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务