程序员人生 网站导航

华为OJ测试题――判断输入的字符串是不是一个有效的IP地址(附世上最全测试数据)

栏目:综合技术时间:2015-05-04 09:47:27

题目标题:

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

 

详细描写:

请实现以下接口

boolisIPAddressValid(constcharpszIPAddr)

输入: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


这个题目也非常简单,但是我们的代码经不住测试,为何呢,由于这个格式要求默许有很多,我们要做仔细人!

给出多组测试数据:

/**********************************

NULL

0.0.0.0

01.2.0.6

255.2.256.0

256.22.234

34 .45.345.6

 2. 3.3.3

 0.1.0.0 

00.00.32.67

**********************************/

下面给出代码,欢迎补充!

#include "IPAddressValid.h" #include<iostream> using namespace std; #include "IPAddressValid.h" #include <cstring> #include <iostream> #include <cstdio> using namespace std; bool isIPAddressValid(const char* pszIPAddr) { if(pszIPAddr==NULL || pszIPAddr=="") return false; // 请在此处实现 int slen=strlen(pszIPAddr); // cout<<slen<<endl; int i,j,k,m,n,sum; int sublen[10]; const char *ss=pszIPAddr; <span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>//去除头尾空格 for(i=0;i<slen && ss[i]==' ';i++); if(i==slen)return false; for(j=slen⑴;j>=0 && ss[j]==' ';j--); if(j==0)return false; if(i>=j)return false;
<span style="white-space:pre"> </span>//判断字符串中间是不是有空格,如果有则false for(k=i;k<j;k++) if(ss[k]==' ')return false; // cout<<i<<" "<<j<<endl;
<span style="white-space:pre"> </span>//记录字符串出现的‘.',如果点出现在第1个字符或相邻的元素也是点则false m=0; for(k=i;k<=j;k++) { if(ss[k]=='.') { sublen[m++]=k; if(k==i || k==j) return false; if(ss[k+1]=='.')return false; } }
<span style="white-space:pre"> </span>//如果点数不是3个则false if(m!=3)return false; sublen[m++]=j+1; //for(k=1;k<m;k++) // if((sublen[k]-sublen[k⑴])>4)return false; // for(k=0;k<m;k++) // cout<<sublen[k]<<" "; // cout<<endl;
<span style="white-space:pre"> </span>//判断各子段是不是为0开头,如果是则判断是否是本子段只有0,如果不是则false n=0;k=i; while(n<m){ // for(k=i;k<sublen[n] && ss[k]=='0';k++); // if(ss[k]!='0' && k<sublen[n] && k>i)return false; if(ss[k]=='0') { if(k+1<slen && ss[k+1]!='.')return false; } k=sublen[n]+1; n++; }
<span style="white-space:pre"> </span>//判断各子段转化的整数是不是在0~255之间,如果不是则false n=0; while(n<m){ sum=0; for(k=i;k<sublen[n];k++) { if(ss[k]<'0' || ss[k]>'9')return false; sum=sum*10+ss[k]-'0'; } if(sum>255)return false; i=sublen[n]+1; n++; } return true; }



------分隔线----------------------------
------分隔线----------------------------

最新技术推荐