题解 | #识别有效的IP地址和掩码并进行分类统计#
识别有效的IP地址和掩码并进行分类统计
http://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682
# include <stdio.h>
# include <string.h>
# include <stdbool.h>
# define SIZE 32
// 判断掩码是否正确,正确为1,错误为0
int MaskJudgment(char* st, int len);
// 返回 0 错误,1 A, 2 B 3 C 4 D 5 E 6 无效 7 私有
int IpsJudgment(char *st, int len);
// 返回 0 错误,1 A, 2 B 3 C 4 D 5 E 6 无效 7 私有
int IpFrist(int hard, int scond);
int pows(int n, int k);
int main(void){
int iptag[7] = {0}; // 0~4: A,B,C,D,E. 5:错误, 6,私有
int temp;
char str[SIZE], ips[SIZE], mask[SIZE];
while(scanf("%s", str) != EOF){
int i = 0;
// 将str拆分为 Ip 和 mask
while(str[i] != '~'){
ips[i] = str[i];
i++;
}
ips[i] = '\0';
temp = i + 1;
i = 0;
while(str[temp + i]){
mask[i] = str[temp + i];
i++;
}
mask[i] = '\0';
// 判断
int ip = IpsJudgment(ips, strlen(ips));
int ms = MaskJudgment(mask, strlen(mask));
if(ip == 6);// 无效ip 不做处理,
else if(ip == 0) iptag[5]++; // IP输入错误
else if(ip == 1)// A 类地址
if(!ms) iptag[5]++; // 掩码输入错误
else iptag[0]++;
else if(ip == 2)// B 类地址
if(!ms) iptag[5]++;
else iptag[1]++;
else if(ip == 3)// C 类地址
if(!ms) iptag[5]++;
else iptag[2]++;
else if(ip == 4)// D 类地址
if(!ms) iptag[5]++;
else iptag[3]++;
else if(ip == 5) // E 类地址
if(!ms) iptag[5]++;
else iptag[4]++;
else if(ip == 7) // 私有ip, 172无效地址中的私有地址
if(!ms) iptag[5]++;
else iptag[6]++;
else if(ip == 17) // 10网段,A + 私
if(!ms) iptag[5]++;
else {
iptag[0]++;
iptag[6]++;
}
else if(ip == 37)// 192网段 C + 私
if(!ms) iptag[5]++;
else {
iptag[2]++;
iptag[6]++;
}
}
// 输出
for(int i = 0; i < 7; i++)
printf("%d ",iptag[i]);
return 0;
}
// 返回 0 错误,1 A, 2 B 3 C 4 D 5 E 6 无效 7 私有
int IpsJudgment(char* st, int len){
int num, hard = -1, scond, mark = 0;
for(int i = 0; i < len; i++){
num = 0;
int t = 0;
while(*(st + i) != '.' && i != len){
num = num * 10 + (*(st + i) - '0');
i++;
t = 1;// 用于判断输入是否为空
}
if(mark != -1) mark++;
if(hard == -1) hard = num;
if(mark == 2) scond = num;
if(num > 255 || t == 0) mark = -1;
}
int s = IpFrist(hard, scond);
if(s == 6) return 6;
else if(mark == -1) return 0;
else return s;
}
// 返回 0 错误,1 A, 2 B 3 C 4 D 5 E 6 无效 7 私有
int IpFrist(int hard, int scond){
if(hard == 0) return 6;
else if(hard >= 1 && hard < 127){
if(hard == 10) return 17;
else return 1;
}
else if(hard == 127){
if(scond >= 16 && scond < 32) return 7;
else return 6;
}
else if(hard >= 128 && hard < 192) return 2;
else if(hard >= 192 && hard < 224) {
if(hard == 192 && scond == 168) return 37;
else return 3;
}
else if(hard >= 224 && hard < 240) return 4;
else if(hard >= 240 && hard < 255) return 5;
else return 0;
}
int MaskJudgment(char* st, int len){
int mark = 0;
int num;
if(*st == 0) return 0;
for(int i = len - 1; i >= 0; i--){
num = 0;
int tag = 0;
while(*(st + i) != '.' && i >= 0){
num += (*(st + i) - '0') * pows(10,tag);
tag++;
i--;
}
int size = 8;
while(size--){
if(!(num & 01) && mark != 0) return 0;
if(num & 01 == 1) mark++;//
num >>= 1;
}
}
if(mark == 32) return 0;// 255.255.255.255的情况
else return 1;
}
int pows(int n, int k){
int num = 1;
for(int i = 0; i < k; i++) num *= n;
return num;
}