• IP判断 soj1103


                                                           IP判断

    基于Internet的程序中,我们常常需要判断一个IP字符串的合法性。

    合法的IP是这样的形式:

    A.B.C.D

    其中A、B、C、D均为位于[0, 255]中的整数。为了简单起见,我们规定这四个整数中不允许有前导零存在,如001这种情况。

    现在,请你来完成这个判断程序吧^_^

    Input

    输入由多行组成,每行是一个字符串,输入由“End of file”结束。

    字符串长度最大为30,且不含空格和不可见字符。

    Output

    对于每一个输入,单独输出一行

    如果该字符串是合法的IP,输出YES,否则,输出NO

    Sample Input

    202.115.32.24
    a.b.c.d

    Sample Output

    YES
    NO
    题意很明确:判断给出的字符串是否属于合法的IP。合法的IP必须符合以下几个条件:
    1)形如a.b.c.d,有且只能有3个'.';
    2)有且只有4个整数,并在[0,255]范围内,不允许有前导0;
    3)a,b,c,d只能包含数字;
    4)第一个'.'不能在第一个位置,第三个'.'不能在末尾,相邻两个'.'位置之差必须大于1

      

    #include<iostream>
    #include<string.h>
    #include<stdio.h>
    #include<stdlib.h>
    usingnamespace std;
    
    int judge(char IP[])
    {
        int i,j;
        int len;
        int point[3];
        int ip[4];
        memset(point,0,sizeof(point));
        memset(ip,0,sizeof(ip));
        len=strlen(IP);
        if(len<7||len>15) //合法的IP字符串长度必定在[7,15]范围内
        {
            return0;
        }
        else
        {
            for(i=0;i<len;i++) //只能是数字和字符'.'
            {
                if(!(IP[i]>='0'&&IP[i]<='9'||IP[i]=='.'))
                {
                    return0;
                }
            }
            j=0;
            for(i=0;i<len;i++) //判断字符'.'的个数,有且只能有3个
            {
                if(IP[i]=='.')
                    j++;
            }
            if(j!=3)
            {
                return0;
            }
            j=0;
            for(i=0;i<len;i++)
            {
                if(IP[i]=='.')
                    point[j++]=i;
            }
            
            //第一个'.'不能在IP的初始位置,第三个'.'不能在末尾,相邻两个'.'位置之差必须大于1
            if(!(point[0]>0&&point[2]<len-1&&(point[1]-point[0])>1&&(point[2]-point[1])>1)) 
            {
                return0;
            }
            if(point[0]>1) //判断是否存在前导0
            {
                if(IP[0]=='0')
                    return0;
            }
            if((point[1]-point[0])>2)
            {
                if(IP[point[0]+1]=='0')
                    return0;
            }
            if((point[2]-point[1])>2)
            {
                if(IP[point[1]+1]=='0')
                    return0;
            }
            if((len-point[2])>2)
            {
                if(IP[point[2]+1]=='0')
                    return0;
            }
            j=0;
            for(i=0;i<len;i++) //求算4个整数的大小
            {
                if(IP[i]!='.')
                    ip[j]=ip[j]*10+IP[i]-48;
                else
                    j++;
            }
            for(i=0;i<4;i++) //判断数字是否在[0,255]范围内
            {
                if(!(ip[i]>=0&&ip[i]<=255))
                {
                    return0;
                }
            }
            return1;
        }
    }
    
    int main(void)
    {
        char IP[35];
        while(scanf("%s",IP)==1)
        {
            if(judge(IP))
                printf("YES\n");
            else
                printf("NO\n");
        }
        return0;
    }
  • 相关阅读:
    Example of Formalising a Grammar for use with Lex & Yacc
    TCL脚本语言基础介绍
    linux环境下的c++编程
    如何利用FPGA进行时序分析设计
    可移植的配置visual studio工程第三方库
    [转]windows10 1703 鼠标右键打开命令提示符cmd
    重载和const形参的学习心得
    华为codecraft2018总结
    【转】C/C++使用心得:enum与int的相互转换
    C++学习笔记1-使用数组进行vector初始化
  • 原文地址:https://www.cnblogs.com/dolphin0520/p/2015194.html
Copyright © 2020-2023  润新知