華為OJ測試題――判斷輸入的字符串是不是一個有效的IP地址(附世上最全測試數據)
來源:程序員人生 發布時間:2015-05-04 09:47:27 閱讀次數:3926次
題目標題:
詳細描寫:
請實現以下接口
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
這個題目也非常簡單,但是我們的代碼經不住測試,為何呢,由于這個格式要求默許有很多,我們要做仔細人!
給出多組測試數據:
/**********************************
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;
}
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈