識別有效的IP位址和掩碼並進行分類

2021-08-03 13:47:55 字數 3308 閱讀 3838

請解析ip位址和對應的掩碼,進行分類識別。要求按照a/b/c/d/e類位址歸類,不合法的位址和掩碼單獨歸類。所有的ip位址劃分為 a,b,c,d,e五類:

a類位址1.0.0.0~126.255.255.255;

b類位址128.0.0.0~191.255.255.255;

c類位址192.0.0.0~223.255.255.255;

d類位址224.0.0.0~239.255.255.255;

e類位址240.0.0.0~255.255.255.255

私網ip範圍是:

10.0.0.0~10.255.255.255

172.16.0.0~172.31.255.255

192.168.0.0~192.168.255.255

子網掩碼為前面是連續的1,然後全是0。(例如:255.255.255.32就是乙個非法的掩碼)

本題暫時預設

以0開頭的ip位址是合法的,比如0.1.1.2,是合法位址

多行字串。每行乙個ip位址和掩碼,用~隔開。

統計a、b、c、d、e、錯誤ip位址或錯誤掩碼、私有ip的個數,之間以空格隔開。

示例1

10.70.44.68~255.254.255.0

1.0.0.1~255.0.0.0

192.168.0.2~255.255.255.0

19..0.~255.255.255.0

1 0 1 0 0 2 1

解題思路

本題的關鍵是如何判斷ip位址和掩碼的有效性。ip位址的有效性比較好判斷,只要由四個整數組成,並且每個整數在0-255之間即可。掩碼的有效性相對麻煩一些,根據題目的提示,合法的子網掩碼前面是連續的1,後面全是0。對此,需要注意以下幾點:

第一,子網掩碼是32位的,即由四個整數組成, 每個整數為8位,範圍咋0-255之間。

第二,全0和全1的子網掩碼都是非法的,即0.0.0.0和255.255.255.255是非法的。

第三,前面是連續的1,後面全是0。即最後乙個1的位置必須在第乙個0的位置前面。

為了判斷子網掩碼的合法性,必須先將子網掩碼表示成二進位制字串的形式。具體來說,先將子網掩碼以.為分隔提取四個子串,並將每個子串都轉化為二進位制字串。以最後的二進位制字串來判斷子網掩碼的合法性會比較方便。

完成了ip位址和子網掩碼的合法性判斷後,分類就比較簡單了。需要注意的是,乙個ip位址可能同時屬於私網ip和abcde中的某一類,也可能不屬於任何一種題目中給出的分類(比如0.255.36.47)。

最後,需要注意輸出格式。前面的各類ip位址以空格分開,最後乙個後面不要空格,直接換行,否則會出錯==

**

#include #include #include using namespace std;

void split(const string& str, string& str1, string& str2); //將str分成ip位址和掩碼,分別存入str1和str2

bool ismaskvalid(const string& str2); //判斷子網掩碼是否有效

bool isipvalid(const string& str1); //判斷ip位址是否有效

vectorsplit(const string& str); //將str以.為分隔

string transfertobinary(const vector& str); //將str中所有string轉化為乙個二進位制字串

string transfertobinary(const string& str); //將str轉化為二進位制字串

int typeofip(const string& str); //確認ip型別,1-5對應a-e,6-8對應三類私網ip, 9對應不屬於任何分類的合法分類

void print(const vector& count); //輸出統計結果

int main()

int type = typeofip(str1); //確認ip型別,1-5對應a-e,6-8對應三類私網ip,9對應不屬於任何分類的合法分類

if (type == 6 || type == 7 || type == 8)

else if (type >= 1 && type <= 5)

count[type - 1]++; //a-e類

}print(count); //輸出統計結果

return 0;

}void split(const string& str, string& str1, string& str2)

//將str分成ip位址和掩碼,分別存入str1和str2

bool ismaskvalid(const string& str) //判斷子網掩碼是否有效

if (all0 || all255) 與255.255.255.255無效

return 0;

string binarystr = transfertobinary(vecstr); //將str3轉化為二進位制字串

int index1 = binarystr.find('0'); //找到第乙個0的位置

int index2 = binarystr.find_last_of('1'); //找到最後乙個1的位置

if (index1 < index2) //第乙個0在最後乙個1之前

return 0;

return 1;

}bool isipvalid(const string& str) //判斷ip是否有效

return 1;

}vectorsplit(const string& str) //將str以.為分隔

vecstr.push_back(str.substr(begin, str.size() - begin)); //最後乙個子字串

return vecstr;

}string transfertobinary(const vector& vecstr) //將vecstr轉化為二進位制字串

return binstr;

}string transfertobinary(const string& str) //將str轉化為二進位制字串

return str2;

}int typeofip(const string& str) //確認ip型別,1-5對應a-e,6-8對應三類私網ip, 9對應無效ip

void print(const vector& count) //輸出統計結果

識別有效的IP位址和掩碼並進行分類統計

include include include include using namespace std static int result 7 儲存最後結果的陣列 string chang string str 轉換為二進位制 itoa num,tmp1,2 把num轉換為二進位制,並以字串形式儲存...

識別有效的IP位址和掩碼並進行分類統計

描述 請解析ip位址和對應的掩碼,進行分類識別。要求按照a b c d e類位址歸類,不合法的位址和掩碼單獨歸類。所有的ip位址劃分為 a,b,c,d,e五類 a類位址1.0.0.0 126.255.255.255 b類位址128.0.0.0 191.255.255.255 c類位址192.0.0....

識別有效的IP位址和掩碼並進行分類統計

標籤 空格分隔 oj 演算法 請解析ip位址和對應的掩碼,進行分類識別。要求按照a b c d e類位址歸類,不合法的位址和掩碼單獨歸類。所有的ip位址劃分為 a,b,c,d,e五類 a類位址1.0.0.0 126.255.255.255 b類位址128.0.0.0 191.255.255.255 ...