这个问题注意一下几点
- 255.255.255.255 为非法子网掩码(题目的意思,实际这个掩码,也能用)
- 当子网掩码错误时,不在判断ip是否有效,错误直接加一, 进行下次循环
- 当一个ip属于ABCDE类中的一个时候,也属于私有ip时,私有ip和他属于的分类都应该加一
解题的方法
-
判断子网掩码是否有效
- 通过判断是否为255.255.255.255 如果是的话,错误加一,继续下次循环
- 判断别的子网掩码是否正确。根据子网掩码二进制规律(开头为连续的1,然后为0),我们将子网掩码按位取反,然后加一,得到的新二进制位,然后我们通过判断二进制中1的个数来判断是否为合法的子网掩码。(因为合法的子网掩码,按位取反,加一后,二进制位中,只有一个1)
int validMask(char *p) { int flag,i ; unsigned int b1 = 0, n[4]; sscanf(p, "%u.%u.%u.%u", &n[3], &n[2], &n[1], &n[0]); if(n[0] == 255 &&n[1] == 255 &&n[2] == 255 &&n[3] == 255 ) { flag = false; return flag; } for(i = 0; i < 4; ++i) b1 += n[i] << (i * 8); b1 = ~b1 + 1; if((b1 & (b1 - 1)) == 0) { flag = true; } else flag = false; return flag; }
-
判断ip时候有效,我们可以通过网络编程中自带的函数进行判断
#include <arpa/inet.h> int inet_pton(int family, const char *strptr, void *addrptr); 返回:若成功则为1,若输入不是有效的表达格式则为0,若出错则为-1
- 如果ip地址有效,我们就可以判断它属于哪一类,是否是私有ip
-
完整代码