1. 程式人生 > >華為oj【IP地址判斷有效性】

華為oj【IP地址判斷有效性】

#include <iostream>
#include <cstring>
#include<string>
using namespace std;
bool isIPAddressValid(const char* pszIPAddr)
{
    if(pszIPAddr == NULL)
    {
        return false;
    }//if
    int size = strlen(pszIPAddr);
    // 去除前導0
    int start = 0;
    while(pszIPAddr[start] == ' ')
    {
        ++start;
    }//while
    // 去除後導0
    int end = size - 1;
    while(pszIPAddr[end] == ' ')
    {
        --end;
    }//while
    int num = 0;
    int pointCount = 0;
    int first = start;
    for(int i = start;i < end+1;++i)
    {//判斷每個IP段的值是否超過255
        if(pszIPAddr[i] >= '0' && pszIPAddr[i] <= '9')//例如192.163.0.1,讀入字元192並計算192的整數值
        {
            num = num * 10 + pszIPAddr[i] - '0';//這個厲害了,從高位到低位求多位數的值
        }//if
        else if(pszIPAddr[i] == '.' || i == end)
        {
            if(i == start || (pszIPAddr[i-1] < '0' || pszIPAddr[i-1] > '9'))
            {
                return false;
            }
            // 驗證.個數
            if(pszIPAddr[i] == '.')
            {
                ++pointCount;
                if(pointCount > 3)
                {
                    return false;
                }//if
            }//if
            // 遇到.開始清算計算得到的資料合法性
            if(num > 255 || num < 0)
            {
                return false;
            }//if
            // 以0開頭且不為0 例如:023
            if(num != 0 && pszIPAddr[first] == '0')
            {
                return false;
            }//if
            first = i+1;
            num = 0;//一個IP段判斷完將num歸零從新計算
        }//else
        else
        {
            return false;//IP中夾雜空格的時候會進入這個else
        }//else
    }//for
    if(pointCount != 3)
    {
        return false;
    }
    return true;
}
int main()
{
string IPAddr;
while(cin>>IPAddr)
{
const char* pszIPAddr=IPAddr.c_str();
if(isIPAddressValid(pszIPAddr))
	cout<<"IP地址合法"<<endl;
else
	cout<<"IP地址不合法"<<endl;
}
}
注意:參考了Yoon的部落格,但是覺得有些迴圈邊界不太對,做了小的修改,歡迎批評指正