题解 | #识别有效的IP地址和掩码并进行分类统计#
识别有效的IP地址和掩码并进行分类统计
http://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682
#include <stdio.h>
#include <string.h>
#define VALIDIP(a, b, c, d) (a >= 0 && a < 256 && \
b >= 0 && b < 256 &&\
c >= 0 && c < 256 &&\
d >= 0 && d < 256 )
int is_mask_valid(unsigned int a, unsigned int b, unsigned int c, unsigned int d){
unsigned int m = -1;
unsigned int mask;
mask = (a << 24) | (b << 16) | (c << 8) | d;
if (mask == m || mask == 0)
return 0;
for (; (mask & 1) == 0; mask >>= 1, m >>= 1)
;
return mask == m;
}
int main(){
int a, b, c, d, e, invalid, private;
int s1, s2, s3, s4, m1, m2, m3, m4;
char s[40];
char ip[20], mask[20];
a = 0, b = 0, c = 0, d = 0, e = 0, invalid = 0, private = 0;
while (scanf("%s", s) == 1){
sscanf(s, "%[^~]", ip);
sscanf(s+strlen(ip)+1, "%s", mask);
// process ip
if ((sscanf(ip, "%d.%d.%d.%d", &s1, &s2, &s3, &s4) == 4) && VALIDIP(s1, s2, s3, s4)){
if (s1 == 0 || s1 == 127)
continue;
// process mask
if ((sscanf(mask, "%d.%d.%d.%d", &m1, &m2, &m3, &m4) == 4)
&& is_mask_valid(m1, m2, m3, m4)){
if (s1 < 127){
a++;
if (s1 == 10) private++;
}
else if (s1 < 191){
b++;
if (s1 == 172 && s2 >= 16 && s2 <= 31) private++;
}
else if (s1 < 223) {
c++;
if (s1 == 192 && s2 == 168) private++;
}
else if (s1 < 239) d++;
else e++;
}else{
invalid++;
}
}else{
invalid++;
continue;
}
}
printf("%d %d %d %d %d %d %d", a, b, c, d, e, invalid, private);
return 0;
}