对字符串依次扫描,仅允许出现数字和符号点,一旦遇到其他字符,即刻判断非法。
对于数字,逐个累加计算数值,如果某次数值超过 255,即刻判断非法。
如果遇到符号 . 或者 到达字符串末尾, 将已累计的 数值 保存到 ip_address 变量中, 同时 part 计数加 1。
最后需要严格 要求 part == 4。
#include <cstdint>
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <map>
#include <cctype>
using namespace std;
bool is_ok(const string& s, uint32_t& addr) {
//允许有前导0的版本,例如 00000123.000000000.0001.231 视为合法ip
int n = s.size();
int val = 0, part = 0;
addr = 0;
for (int i = 0; i <= n; i++) {
if (i == n or s[i] == '.') {
addr = (addr << 8) | val;
part++;
val = 0;
} else if ('0' <= s[i] and s[i] <= '9') {
val = val * 10 + s[i] - '0';
if (val > 255) {
return false;
}
} else {
return false; // 含有非法字符
}
}
return part == 4;
}
int solve(string& mask, string& ip1, string& ip2){
uint32_t addr_mask, addr_ip1, addr_ip2;
bool ok1 = is_ok(mask, addr_mask);
bool ok2 = is_ok(ip1, addr_ip1);
bool ok3 = is_ok(ip2, addr_ip2);
if(not ok1 or not ok2 or not ok3){
return 1;
}
//检查掩码是否全是前导 1
if(addr_mask + (addr_mask & -addr_mask) != 0){
return 1;
}
if((addr_ip1 & addr_mask) == (addr_ip2 & addr_mask)){
return 0;
}
return 2;
}
int main() {
string mask, ip1, ip2;
cin >> mask >> ip1 >> ip2;
cout << solve(mask, ip1, ip2);
}
// 64 位输出请用 printf("%lld")


京公网安备 11010502036488号