華為機試題——識別有效的IP地址和掩碼並進行分類統計
阿新 • • 發佈:2019-02-15
請解析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
輸入描述:
多行字串。每行一個IP地址和掩碼,用~隔開。
輸出描述:
統計A、B、C、D、E、錯誤IP地址或錯誤掩碼、私有IP的個數,之間以空格隔開。
輸入例子:
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
程式碼如下:
#include <stdlib.h> #include <iostream> #include <vector> #include <string> #include <sstream> using namespace std; vector<string> split(string str, char del){ stringstream ss(str); string tok; vector<string> ret; while(getline(ss, tok, del)){ ret.push_back(tok); } return ret; } bool IPisvalid(vector<string> svec){ if(svec.size() != 4){ return false; } return true; } bool Maskisvalid(vector<string> svec){ bool zero = false; if(svec.size() != 4){ return false; } for(int i = 0; i < 4; i++){ if(zero == false){ if(atoi(svec[i].c_str()) != 255){ if(atoi(svec[i].c_str()) != 0 && atoi(svec[i].c_str()) != 128 && atoi(svec[i].c_str()) != 192 && atoi(svec[i].c_str()) != 224 && atoi(svec[i].c_str()) != 240 && atoi(svec[i].c_str()) != 248 && atoi(svec[i].c_str()) != 252 && atoi(svec[i].c_str()) != 254){ return false; }else{ zero = true; } } }else{ if(atoi(svec[i].c_str()) != 0){ return false; } } } if(atoi(svec[3].c_str()) == 255){ return false; } return true; } int main(){ vector<int> ret(7, 0); string str; vector<string> svec; vector<string> ip; vector<string> mask; while(getline(cin, str)){ svec = split(str, '~'); ip = split(svec[0], '.'); mask = split(svec[1], '.'); if(Maskisvalid(mask) && IPisvalid(ip)){ if (atoi(ip[0].c_str()) >= 1 && atoi(ip[0].c_str()) <= 126){ ++ret[0]; if (atoi(ip[0].c_str()) == 10) ++ret[6]; }else if (atoi(ip[0].c_str()) >= 128 && atoi(ip[0].c_str()) <= 191){ ++ret[1]; if (atoi(ip[0].c_str()) == 172){ if (atoi(ip[1].c_str()) >= 16 && atoi(ip[1].c_str()) <= 31) ++ret[6]; } } else if (atoi(ip[0].c_str()) >= 192 && atoi(ip[0].c_str()) <= 223){ ++ret[2]; if (atoi(ip[0].c_str()) == 168) ++ret[6]; } else if (atoi(ip[0].c_str()) >= 224 && atoi(ip[0].c_str()) <= 239){ ++ret[3]; } else if (atoi(ip[0].c_str()) >= 240 && atoi(ip[0].c_str()) <= 255){ ++ret[4]; } }else{ ret[5]++; } } cout << ret[0] << " " << ret[1] << " " << ret[2] << " " << ret[3] << " " << ret[4] << " " << ret[5] << " "<< ret[6] << endl; return 0; }