华为oj-判断输入的字符串是不是一个有效的IP地址

题目标题:

  • 判断输入的字符串是不是一个有效的IP地址

 

详细描述:

请实现如下接口

boolisIPAddressValid(constchar* pszIPAddr)

输入:pszIPAddr 字符串

输出:true 有效的IP地址,false,无效的IP地址

 

约束

  1. 输入IP为XXX.XXX.XXX.XXX格式

  2. 字符串两端含有空格认为是合法IP

  3. 字符串中间含有空格认为是不合法IP

  4. 类似于 01.1.1.1, 1.02.3.4  IP子段以0开头为不合法IP

  5. 子段为单个0 认为是合法IP,0.0.0.0也算合法IP

C语言代码:

 1 #include "IPAddressValid.h"
 2 #include <string.h>
 3 
 4 bool isIPAddressValid(const char* pszIPAddr)
 5 {
 6     // 请在此处实现
 7     if(pszIPAddr == 0 || pszIPAddr == "")
 8         return false;
 9     char *p=const_cast<char*>(pszIPAddr);
10     char *pre=0;
11     bool flag=true;
12     bool last=false;
13     int pCount=0; //point number;
14     int num=0;
15     while(*p==' ')//不考虑前面的空格
16         p++;
17   //if(*p=='.')
18   //    return false;
19     while(*p!='\0'){
20         if (*p != '.'){
21             if(pCount < 3 && (*p>'9'||*p<'0'))
22                 return false;
23             if(pCount == 3){
24                 if(*p != ' ' && (*p>'9'||*p<'0'))//
25                     return false;
26                 if(*p == ' ')//第三个'.'后面有空格,应该为结尾的空格
27                     last = true;
28                 if(last && *p<='9'&&*p>='0')
29                     return false;
30             }
31             if(flag)//新的子段开始。
32                 pre = p;
33             flag=false;
34         }else{//发现一个"."
35             pCount++;
36             if(!flag){
37                 if((p-pre>1&&*pre=='0')||(p-pre>3))//排除子段以0开头,或者子段的长度大于3
38                     return false;
39                 if(p-pre == 3){
40                     num=(*pre-'0')*100;
41                     num+=(*(++pre)-'0')*10;
42                     num+=(*(++pre)-'0');
43           
44                     if(num>255)
45                         return false;
46                 }
47             }else if(p-pre==1){//连续出现两个'.'
48                 return false;
49             }else
50                 return false;
51             flag=true;//下一个新的子段开始
52              pre=p;
53         }
54         p++;
55     }
56     if (pCount!=3 || *pre=='.'|| (p-pre>1&&*pre=='0'))//如果不是三个子段,或者最后一个字符为'.',或者最后一个子段第一个字符为'0'。
57         return false;
58     num=0;
59     while(*pre<='9'&&*pre>='0'){
60         num=num*10;
61         num=num+(pre[0]-'0');
62     
63         pre++;
64     }
65     if(num>255)
66         return false;
67 
68     return true;
69 }

 

转载于:https://www.cnblogs.com/wanghui390/p/4311877.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值