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

时间:2023-03-09 19:24:34
华为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 }