#include <iostream> #include <string> #include <vector> #include <sstream> #include <bitset> using namespace std; int A = 0, B = 0, C = 0, D = 0, E = 0; int err = 0; int private_ip = 0; void judge(string ip, string mask) { // cout << ip << "\t" << mask << endl; stringstream ss_ip(ip); stringstream ss_mask(mask); string token; vector<string> ip_field; vector<string> mask_field; while (getline(ss_ip, token, '.')) { // cout << token << endl; ip_field.push_back(token); } while (getline(ss_mask, token, '.')) { // cout << token << endl; mask_field.push_back(token); } //如果是特殊字符串直接返回 if (ip_field[0] == "0" || ip_field[0] == "127") return; //判断ip是否非法 bool flag = true; if (ip_field.size() != 4) { err++; flag = false; } if (flag && mask_field.size() != 4) { err++; flag = false; } if (flag) { for (int i = 0; i < 4; i++) { if (ip_field[i].size() == 0 || stoi(ip_field[i]) > 255) { err++; flag = false; break; } } } //判断掩码是否非法 if (flag) { for (int i = 0; i < 4; i++) { if (mask_field[i].size() == 0 || stoi(mask_field[i]) > 255) { err++; flag = false; break; } } } if (flag == true) { string binaryMask; for (auto part : mask_field) { binaryMask += bitset<8>(stoi(part)).to_string(); } if (binaryMask.find('1') == string::npos || binaryMask.find('0') == string::npos) { err++; flag=false; } else { bool foundZero = false; for (auto i : binaryMask) { if (i == '0') foundZero = true; else if (foundZero == true) { err++; flag=false; break; } } } } //如果ip合法,判断ip属于哪一类 if (flag) { int first_field = stoi(ip_field[0]); if (first_field <= 126 && first_field >= 1) A++; else if (first_field <= 191 && first_field >= 128) B++; else if (first_field <= 223) C++; else if (first_field <= 239) D++; else E++; int second_field = stoi(ip_field[1]); if (first_field == 10) private_ip++; if (first_field == 172 && second_field >= 16 && second_field <= 31) private_ip++; if (first_field == 192 && second_field == 168) private_ip++; } } int main() { string input; while (getline(cin, input)) { size_t t = input.find_first_of('~'); string ip_address = input.substr(0, t); string subnet_mask = input.substr(t + 1, input.size() - t); // cout<<ip_address<<" "<<subnet_mask<<endl; //判断ip地址 judge(ip_address, subnet_mask); } cout << A << " " << B << " " << C << " " << D << " " << E << " " << err << " " << private_ip; }