题解 | 识别有效的IP地址和掩码并进行分类统计
#include <iostream> #include <array> using namespace std; bool ParseIP(string str, array<int, 4>& ip) { for (int i = 0; i < 4; i++) { int pos = str.find('.'); string sub = str.substr(0, pos); if (sub.empty()) return false; ip[i] = stoi(sub); str = str.substr(pos + 1); } return true; } bool ParseString(string str, array<int, 4>& ip, array<int, 4>& mask) { int pos = str.find('~'); if (pos == -1) return false; if (!ParseIP(str.substr(0, pos), ip)) return false; if (!ParseIP(str.substr(pos + 1), mask)) return false; return true; } const array<int, 7> s_mask = {128, 128+64, 128+64+32, 128+64+32+16, 128+64+32+16+8, 128+64+32+16+8+4, 128+64+32+16+8+4+2}; bool CheckMask(array<int, 4>& mask) { bool one = false, zero = false; for (int i = 0; i < 4; i++) { if (mask[i] == 255) { if (zero) return false; if (!one) one = true; continue; } if (mask[i] == 0) { if (!one) return false; if (!zero) zero = true; continue; } bool find = false; for (int a: s_mask) { if (a == mask[i]) { find = true; break; } } if (!find) return false; one = true; if (zero) return false; zero = true; } return one && zero; } int main() { string str; int a = 0, b = 0, c = 0, d = 0, e = 0, err = 0, pri = 0; while (cin >> str) { array<int, 4> ip, mask; if (str.find("0.") == 0 || str.find("127.") == 0) continue; if (!ParseString(str, ip, mask)) { err++; continue; } if (!CheckMask(mask)) { err++; continue; } if (ip[0] >= 1 && ip[0] <= 126) a++; else if (ip[0] <= 191) b++; else if (ip[0] <= 223) c++; else if (ip[0] <= 239) d++; else e++; if (ip[0] == 10 || (ip[0] == 172 && ip[1] >= 16 && ip[1] <= 31) || (ip[0] == 192 && ip[1] == 168)) pri++; } printf ("%d %d %d %d %d %d %d\n", a, b, c, d, e, err, pri); } // 64 位输出请用 printf("%lld")
亮点在CheckMask的部分哦,判断是否有1,是否有0,是否存在0在1前