1. 程式人生 > >【C++】判斷IP地址有效性

【C++】判斷IP地址有效性

/*
功能:
    判斷IP地址是否有效
介面函式:
    booli sIPAddressValid ( const char *  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也算合法I
*/

#include <iostream>
#include <cstring>
using namespace std;

bool isIPAddressValid(const char* pszIPAddr)
{
	if (!pszIPAddr) return false; //若pszIPAddr為空
	char IP1[100],cIP[4];
	int len = strlen(pszIPAddr);
	int i = 0,j=len-1;
	int k, m = 0,n=0,num=0;
	//去除首尾空格(取出從i-1到j+1之間的字元):
	while (pszIPAddr[i++] == ' ');
	while (pszIPAddr[j--] == ' ');
	
	for (k = i-1; k <= j+1; k++)
	{
		IP1[m++] = *(pszIPAddr + k);
	}     
	IP1[m] = '\0';
	
	char *p = IP1;

	while (*p!= '\0')
	{
		if (*p == ' ' || *p<'0' || *p>'9') return false;
		cIP[n++] = *p; //儲存每個子段的第一個字元,用於之後判斷該子段是否為0開頭

		int sum = 0;  //sum為每一子段的數值,應在0到255之間
		while (*p != '.'&&*p != '\0')
		{
		  if (*p == ' ' || *p<'0' || *p>'9') return false;
          sum = sum * 10 + *p-48;  //每一子段字串轉化為整數
		  p++;
		}
		if (*p == '.') {
			if ((*(p - 1) >= '0'&&*(p - 1) <= '9') && (*(p + 1) >= '0'&&*(p + 1) <= '9'))//判斷"."前後是否有數字,若無,則為無效IP,如“1.1.127.”
				num++;  //記錄“.”出現的次數,不能大於3
			else
				return false;
		};
		if ((sum > 255) || (sum > 0 && cIP[0] =='0')||num>3) return false;//若子段的值>255或為0開頭的非0子段或“.”的數目>3,則為無效IP

		if (*p != '\0') p++;
		n = 0;
	}
	if (num != 3) return false;
	return true;
}

void main()
{
    char IP[] = " 254.1.1.1 ";
	//char IP[100];
	//cin >> IP;
	bool tf = isIPAddressValid(IP);
	cout << tf<<endl;
	system("pause");
}