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

}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

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