题解 | #识别有效的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;
}
全部评论
写得很干净
点赞 回复 分享
发布于 2023-05-23 08:32 广东
提交时会报错
点赞 回复 分享
发布于 2024-08-18 11:00 江苏

相关推荐

黑皮白袜臭脚体育生:简历条例统一按使用了什么技术实现了什么功能解决了问题或提升了什么性能指标来写会好些,如使用布隆过滤器实现了判断短链接是否存在,大大提升了查询速度
点赞 评论 收藏
分享
评论
5
1
分享

创作者周榜

更多
牛客网
牛客企业服务