华为oj-判断输入的字符串是不是一个有效的IP地址
题目标题:
-
判断输入的字符串是不是一个有效的IP地址
详细描述:
请实现如下接口
boolisIPAddressValid(constchar* pszIPAddr)
输入:pszIPAddr 字符串
输出:true 有效的IP地址,false,无效的IP地址
约束
-
输入IP为XXX.XXX.XXX.XXX格式
-
字符串两端含有空格认为是合法IP
-
字符串中间含有空格认为是不合法IP
-
类似于 01.1.1.1, 1.02.3.4 IP子段以0开头为不合法IP
-
子段为单个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 }