题解 | #识别有效的IP地址和掩码并进行分类统计#
识别有效的IP地址和掩码并进行分类统计
https://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682
#include <stdio.h> enum {A=0,B,C,D,E,ERR,PRIV}; int ifInPrivRange(int *addr) { const unsigned int privaddrs[6][4] = { {10,0,0,0}, {10,255,255,255}, {172,16,0,0}, {172,21,255,255}, {192,168,0,0}, {192,168,255,255} }; long longprivaddrs[6] = {0}; long longaddr = 0; for(int j=0; j<4; j++) { longaddr *= 1000; longaddr += addr[j]; } for(int i=0; i<6; i+=2) { for(int j=0; j<4; j++) { longprivaddrs[i] *= 1000; longprivaddrs[i] += privaddrs[i][j]; longprivaddrs[i+1] *= 1000; longprivaddrs[i+1] += privaddrs[i+1][j]; } if(longaddr>=longprivaddrs[i] && longaddr<=longprivaddrs[i+1]) return PRIV; } return -1; } int ifInRange(int *addr) { const unsigned int addrs[10][4] = { {1,0,0,0}, {126,255,255,255}, {128,0,0,0}, {191,255,255,255}, {192,0,0,0}, {223,255,255,255}, {224,0,0,0}, {239,255,255,255}, {240,0,0,0}, {255,255,255,255} }; long longaddrs[10] = {0}; long longaddr = 0; for(int j=0; j<4; j++) { longaddr *= 1000; longaddr += addr[j]; } for(int i=0; i<10; i+=2) { for(int j=0; j<4; j++) { longaddrs[i] *= 1000; longaddrs[i] += addrs[i][j]; longaddrs[i+1] *= 1000; longaddrs[i+1] += addrs[i+1][j]; } if(longaddr>=longaddrs[i] && longaddr<=longaddrs[i+1]) return i/2; } return -1; } int ifCorMask(int *masks) { int mask = 0; int i; for(i=0; i<4; i++) { mask <<= 8; mask |= masks[i]; } for(i=31; i>=0; i--) { if(!(mask&(0x01<<i))) break; } if(i<0) return 0;//全1,错误 for(; i>=0; i--) { if(mask&(0x01<<i)) break; } if(i >= 0) return 0;//错误 return 1; } int main() { char str[128]; char ip[64], mask[64]; int ips[4], masks[4]; int ret, ret1; char *p; int result[7] = {0}; while(scanf("%s", str) != EOF) { p = strchr(str, '~'); ret1 = sscanf(str, "%d.%d.%d.%d~", &ips[0], &ips[1], &ips[2], &ips[3]); if(ips[0]==0 || ips[0]==127) continue; //先判断掩码 ret = sscanf(p+1, "%d.%d.%d.%d", &masks[0], &masks[1], &masks[2], &masks[3]); if(ret!=4 || !ifCorMask(masks)) { result[ERR]++; continue; } ret = ret1; if(ret != 4) result[ERR]++; else { ret = ifInPrivRange(ips); if(ret >= 0) result[ret]++; ret = ifInRange(ips); if(ret < 0) result[ERR]++; else result[ret]++; } } for(int i=0; i<7; i++) printf("%d ", result[i]); }