华为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 }

 

posted @ 2015-03-03 20:32  soul390  阅读(487)  评论(0编辑  收藏  举报