关于IP合法性判断的题目,每个oj上的约束条件不尽相同,我就根据自己做过的题目吧所有的约束条件汇总到一块,到时候做题时只需要把多余的越是条件删掉即可

题目描述:

对于IP我们总会有一定的规定,合法的IP必须的满足我们给定的条件,先在我们对IP的合法性做出以下的规定。

1.IP中必须有四个数字,三个'.',并且数字的范围要在[0,255]之间

2.IP中除了数字和小数点之外不能够有其他的字符

3.IP的首位不能为'.'

4.还需要的别注意的就是"0000"这种情况虽然转换为整型满足条件,但是实际上所有的数字最多只能为三位数

5.我们添加一个额外的规定,就是所有的数字不允许有前导零存在,如001、000这种情况,但是0是合法的。(当然这个约束条件可以根据题目进行变动,一般的题目没有这个约束条件,只是今天做的题目有,所以就加上了)

6.IP中不能够出现两个连续的'.'

代码:

    #include <iostream>
    #include <stdio.h>
    #include <cstring>
    using namespace std;
    int numShu=0;
    int numDian=0;
    int cinverti(char s[])  //将一个字符串类型的数字转换为整型,并且判断这个数是否有0开头,但是整个数可以为0
    {
        int len,t=0;
        len=strlen(s);
        if(len>=4)//大于三位数,不合法 
            t=-1;
        else
        {
            for(int i=0; i<len; i++)
            {
                t=10*t+s[i]-'0';  //将这个数计算出来
            }         
            if(len>=2&&s[0]=='0' )//如果数是大于两位并且第一位为0肯定不合法
                t=-1;//标记这个数不合法   
        }
        return t;
    }
    int IsIP(char str[])
    {
        numShu=0;
        numDian=0;
        char  tmp[10];
        int i=0,num;
        for(int j=0; str[j]!='\0'; j++) //循环整个ip
        {
            i=0;
            if(str[0]=='.')//首位为0的,肯定就是不合法的 
                return 0;
            while(str[j]!='.'&&str[j]!='\0')
            {
                if(str[j] >'9'||str[j]<'0')//出现不是数字的,不合法 
                    return 0;
                if(str[j]>='0'&&str[j]<='9')//将当前的数字字符串放到temp中暂存 
                {
                    tmp[i]=str[j]; 
                    j++;
                    i++;
                }
            }
            if(str[j]=='.'&&str[j-1]=='.')//出现连续两个'.',不合法 
                return 0;
            if(str[j]=='.'&&str[j+1]!='.'&&str[j-1]!='.')//不是连续的,小数点位数加 
            {
                numDian++;
            }
            tmp[i]='\0';
            num=cinverti(tmp);//转换为int型 
            if(num<0||num>255)//超出约定范围,不合法 
                return 0;
            else
              numShu++;//否则,数的位数加 
        }
        if(numShu==4&&numDian==3 )
            return 1;
        else
            return 0;
    }
    
    int main()
    {
        char ip[30]= {'\0'};
        while(cin>>ip)
        {
            if(IsIP(ip))
                printf("Y\n");
            else
                printf("N\n");
        }
        return 0;
    }
posted on 2017-04-18 19:38  渡……  阅读(522)  评论(0编辑  收藏  举报