题解 | #验证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)
 int CheckCharVaild(char* IP)
 {
    int i=0,len=strlen(IP);
    char c;
    char *ipv4=strchr(IP,'.');
    char *ipv6=strchr(IP,':');
    //字符'.'和':'必须存在一个,且不能两个同时存在
    if(ipv4&&ipv6){ 
       return 0;
    }else if(ipv4==NULL&&ipv6==NULL)
       return 0;
       printf("45667 \n");
    //检查字符存在的合法性,比如IPV4不能出现ABCabc字符,ipV6不能出现#%$字符
    for(i=0;i<len;i++){
        c=IP[i];
        if(IsMiddle(0x39,0x30,c)==1)
           continue;
        else if(c=='.'||c==':')
            continue;
        else if(ipv6){
           if(IsMiddle('F','A',c)==1||IsMiddle('f','a',c)==1)
                 continue;
            else
                return 0;
        }
        else
             return 0;
    }
    return (ipv6==NULL?  1:2);
 }

int GetStrCnt(char* str,char value){
    int len=0;
    char *p=str;
    while(1){
       p=strchr(p,value);
       if(p)
          len++;
       else
         break;
       p++;
    }
    return len;
}
int IPvCheck(char* IP,int type)
{
   struct IPkeyword{
      char *div;    //分割符号
      char divnum;  //分割符号个数
      int  base;    //字符串10、16进制
      int  max;     //每个分割字符串最大值  ipv4是255
   }key[3]={{NULL,0,0,0},{".",3,10,255},{":",7,16,0xffff}};
   int index=0;
   char *p;
   char*div   =key[type].div;
   char divnum=key[type].divnum;
   int  base  =key[type].base;
   int  max   =key[type].max;
   if(type==0)
       return 0;
   if(GetStrCnt(IP,*div)!=divnum)
       return 0;
   for(index=0;index<=divnum;index++){
       p=(index==0 ? strtok(IP,div) : strtok(NULL,div));
       if(p==NULL)
           return 0;
       else if(strtol(p,NULL,base)>max)
          return 0;
       if(strlen(p)>=2&&p[0]==0x30){
           if(type==2&&p[1]==0x30)
               return 0;
           if(type==1)
              return 0;
       }     
   }
   return type;
}

char* solve(char* IP ) {
    // write code here
    int type=0;
    static char IpType[3][12]={{"Neither"},{"IPv4"},{"IPv6"}};
    type=CheckCharVaild(IP);
    //printf("type=%d \n",type);
    type=IPvCheck(IP,type); 
    return &IpType[type][0];
  

}

全部评论

相关推荐

黑皮白袜臭脚体育生:五宿大战是吧,死去的记忆还在攻击我
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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