1. 程式人生 > >判斷字串是否為IP地址

判斷字串是否為IP地址

bool IsIPAddress(const char *str)
{
	if(str==NULL || *str=='\0' || *str=='.') //這個地方就不解釋了
		return false;
	int len=strlen(str);
	int i=0,j=0;        //i用來控制迴圈,j用來指示陣列arr[]
	int arr[4];         //arr[4]用來儲存ip四個欄位的值,如"192.234.156.1",arr[0]儲存192,arr[1]儲存234....
	memset(arr,0,sizeof(int)*4);   //陣列初始化
	for (;i<len;i++)
	{
		if (str[i]>='0' && str[i]<='9')  //如果當前字元是數字
		{
			arr[j]=arr[j]*10+str[i]-'0';  //用arr[j]儲存當前欄位的數值
			
		}
		else if (str[i]=='.')            //如果當前字元是'.'
		{	
			if (str[i+1]=='\0' || str[i+1]=='.')//如果下一個字元為結尾符或出現連續兩個'.'
			{
				return false;
			}
			j++;    //進入下一個欄位
			if(j>3)  //如果欄位數大於4個,說明肯定不是ip地址;注arr[0]-arr[3],所以是j>3,不是j>4
				return false;
			//arr[j]=0;【此處已更正,這兩行話可忽視】//【注意!】這個地方沒弄懂!我上面明明已經用memset把陣列arr[]都初始化為0 了,
                           //但是,如果沒有這句話,那麼程式執行出現錯誤結果
		}
		else    //出現數字和'.'之外的任何其他字元,表明非ip地址
			return false;
	}
	
	if (j==3 && arr[0]<=255 && arr[1]<=255 && arr[2]<=255 && arr[3]<=255)
	{  //如果是IP地址,那麼肯定有四個欄位,即j==3
		return true;
	}
	else
		return false;
}


void main()
{
	char *str="255.234.234.0";
	if(IsIPAddress(str))
		cout<<"Is IP address!"<<endl;
	else
		cout<<"NOT IP address!"<<endl;
}

注:1、測試用例我沒有附上,大家如果有興趣可以自己測試一下,我測了好多都沒問題

        2、程式中【注意!!】的地方,我上面明明已經用memset把陣列arr[]都初始化為0了,但是,如果沒有這句話,那麼程式執行出現錯誤結果,還請大家幫忙分析一下

        3、對於注2中的問題已經找到問題所在,memset()使用錯誤,應該是memset(arr,0,sizeof(int)*4);程式中已經更正