题解 | #合法IP#

合法IP

https://www.nowcoder.com/practice/995b8a548827494699dc38c3e2a54ee9

#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>

int HasHeadZeros(char *str);
int CheckIfIpAddress(char *addr);

int main() {
    char buf[30] = {0};
    scanf("%s", buf);
    if(CheckIfIpAddress(buf))
    {
        printf("YES\n");
    }else {
        printf("NO\n");
    }
    return 0;
}

//一些可能的输入和输出:输入保证不含有空格
//192.168.0.1  ---> YES
//10.137.17.1---->YES
//ab.43.12.4 --->NO 包含字母
//99999.53.23.5---->NO 超过最大
//255.255.255.255--->YES 最大的IP地址,字符串长度 15个,如果超过15个,就不是
//0.0.0.0--->YES 最小的IP地址,字符串长度7个
//$bd.$$$.df.fdd-->NO 包含特殊符号
//""--->NO 空字符串:不睡
//4.3.2  NO 不是,点不够
//57432983# NO 没有., 
//...434 NO
//01.2.3.8 ---->有前导0的情况


//思路
//1. 检查参数是否为空指针。
//2. 检查字符串长度 是否在[7, 15]之间,如果不是,则返回0
//3. 检查.的个数,应该为3,如果不是,则返回0
//4. 按照. 进行分割字符串。设计一个 char addrpart[4][4];(循环查找,遇到.放进里面)
//5. 在放的过程中,检查放的是不是数字,并安排一个计数器,放的次数不能超过3.
/*
*@func:检查输入是否是一个有效ip地址
*@ret:如果是,则返回1, 如果不是,则返回0
*/
int CheckIfIpAddress(char *addr)
{

    if(addr == NULL)
    {
        return 0;
    }
    int pointcnt = 0;
    int len = strlen(addr);
    if((len<7) || (len>15))
    {
        return 0;
    }
    
    char addrpart[4][4] = {0};
    int numpart[4];
    int k=0;
    for(int i=0; i<len; i++)
    {
        if(addr[i] == '.')
        {
            pointcnt++;
            if(pointcnt > 3)
            {
                return 0;
            }
            k=0;
        }else if(!isdigit(addr[i]))
        {
            return 0;
        }
        else 
        {
            addrpart[pointcnt][k++] = addr[i];
        }
    }
    for(int i=0; i<4; i++)
    {
        if(strlen(addrpart[i]) == 0)
        {
            return 0;
        }
        else {
            //排除前导0的情况
            if(HasHeadZeros(addrpart[i]))
            {
                return 0;
            }
            numpart[i] = atoi(addrpart[i]);
            if(numpart[i] > 255)
            {
                return 0;
            }
        }
    }
    return 1;
}


int HasHeadZeros(char *str)
{
    int len = strlen(str);
    if(len==1)
    {
        return 0;
    }

    if(str[0] == '0')
    {
        return 1;
    }
    return 0;
}

全部评论

相关推荐

昨天 20:09
武汉纺织大学 C++
点赞 评论 收藏
分享
秋招之BrianGriffin:你再跟他说华为工资也低(相对互联网)就可以享受私信爆炸了😋
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务