HJ90 合法IP(容易考虑不全面)

描述

IPV4地址可以用一个32位无符号整数来表示,一般用点分方式来显示,点将IP地址分成4个部分,每个部分为8位,表示成一个无符号整数(因此正号不需要出现),如10.137.17.1,是我们非常熟悉的IP地址,一个IP地址串中没有空格出现(因为要表示成一个32数字)。

现在需要你用程序来判断IP是否合法。

数据范围:数据组数:1≤t≤18 

进阶:时间复杂度:O(n) ,空间复杂度:O(n) 

输入描述:

输入一个ip地址,保证不包含空格

输出描述:

返回判断的结果YES or NO

示例1

输入:

255.255.255.1000

输出:

NO

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

int main() {
    
    

    char str[40];
    /*
        ——1.输入
    */
    scanf("%s",str);
    
    /*
        ——2.提取IP地址4部分
    */
    int m=0,n=0;
    char num[4][20]={0};  //IP地址的4个部分
    for(int i=0 ; i<strlen(str) ; i++)
    {
        if(str[i]=='.')
        {
            m++;
            n=0;
        }
        else {
            num[m][n] = str[i];
            n++; 
        }
    }
    
    /*
        ——3.判断IP地址合法性:
            看IP地址是否4部分——看m==3?
                不是4部分  ==> 不合法
                是4部分 ==> 看IP地址4部分是否有空:
                    若有空 ==> 不合法
                    全非空 ==> 看取值范围是否属于[0 , 255]:
                        不属于 ==> 不合法
                        属于   ==> 看10以内的数字表示是否正确:!!!容易忽略
                            若10以内数字表示为类似01、001则不合法

    */
    int flag=1; //用于标志合法性:1-合法,0-不合法
    if(m==3) //判断IP地址是否4部分
    {
        for(int i=0 ; i<=m ; i++) //判断4部分是否有空
        {
            //printf("%s\n", num[i]);
            if(strlen(num[i]) == 0)  //为空,即长度为0
            {
                flag=0;
                break;
            }
        
        }
        if(flag==1) //若4部分均非空,判断取值范围
        {
            for(int i=0 ; i<=m ; i++)  
            {
            //printf("%d\n",atoi(num[i]));
            if( atoi(num[i]) < 0 || atoi(num[i]) > 255) //atoi()函数将数字字符串转换成数字
                {
                    flag=0;
                    break;
                }
            else {
                //数字都在取值范围,但是表10以内的数字表示不对,如01、001
                if(atoi(num[i]) && atoi(num[i]) <10 && strlen(num[i])>1)
                {
                    flag=0;
                    break;
                }
            }

            }
        }
    }
    else {
        flag=0;
    }
    
    
    /*
        ——4.输出
    */
    if(flag==1)
        printf("YES\n");
    else
        printf("NO\n");

    return 0;
}

不合法测试样例

不合法不合法原因
1.3.6非4部分
.1.3.6存在为空的部分
01.2.5.7

存在10以内的整数表示不符合要求的部分

1.2.3.1009存在数据范围不属于[0,255]的部分

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值