• IP判断 (字符串处理)


    关于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]!=''; j++) //循环整个ip
            {
                i=0;
                if(str[0]=='.')//首位为0的,肯定就是不合法的 
                    return 0;
                while(str[j]!='.'&&str[j]!='')
                {
                    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]='';
                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]= {''};
            while(cin>>ip)
            {
                if(IsIP(ip))
                    printf("Y
    ");
                else
                    printf("N
    ");
            }
            return 0;
        }
    
  • 相关阅读:
    app专项测试之稳定性测试-monkey测试
    Mac下Fiddler的安装启动。
    测试环境搭建和部署(在Linux环境下搭建jdk+Tomcat+mysql环境和项目包的部署)
    mysql如何用sql语句修改表字段?
    VMware虚拟机出现“正在使用中”如何解决?
    Opencv2.1+vs2008生成不依赖编译环境的exe文件
    VS2008在win7下不时出现Microsoft Incremental Linker已停止工作
    没有找到opencv_core231d.dll运行结果不能显示
    Mat类型与IplImage类型之间相互转换
    获取当前可执行文件的路径(绝对路径)
  • 原文地址:https://www.cnblogs.com/cmmdc/p/6729555.html
Copyright © 2020-2023  润新知