華為oj【IP地址判斷有效性】
阿新 • • 發佈:2019-01-05
注意:參考了Yoon的部落格,但是覺得有些迴圈邊界不太對,做了小的修改,歡迎批評指正#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; } }