#include <string.h>
#include <math.h>
/*
Name: maskIsIllegal
Desc: 判断子网掩码是否合法
Return: 0: 合法,非零:非法
*/
int maskIsIllegal(int *mask, int size)
{
int result = 0;
int isMask = 0;
int num;
// printf("mask = %d.%d.%d.%d\n", mask[0], mask[1], mask[2], mask[3]);
if(mask[0] == 255 && mask[1] == 255 && mask[2] == 255 && mask[3] == 255)
{
return -4;
}
for(int i = 0; i < size; i++)
{
num = mask[i];
if(num != 0 && isMask != 0) //掩码错误,...254.255情况
{
return -3;
}
if(num < 0 || num > 255)
{
return -2;
}
else if(num != 255) //掩码不为 255置标志位
{
isMask = 1;
}
if(num == 0)
{
continue;
}
for(int j = 7; j >= 0; j--)
{
num -= pow(2, j);
if(num == 0)
{
break;
}
if(num < 0)
{
return -1;
}
}
}
return result;
}
/*
Name: ipIsIllegal
Desc: 判断IP是否合法
Return: 0: 合法,非零:非法
*/
int ipIsIllegal(int *ip, int size)
{
int ipNum;
// printf("ip = %d.%d.%d.%d\n", ip[0],ip[1], ip[2], ip[3]);
for(int i = 0; i < size; i++)
{
ipNum = ip[i];
if(ipNum < 0 || ipNum > 255)
{
return -1;
}
}
return 0;
}
int main()
{
char input[32] = {0};
int ip[4] = {-1};
int mask[4] = {-1};
int numA = 0, numB = 0, numC = 0, numD = 0, numE = 0, numErrIP = 0, numErrMask = 0, numPrivateIp = 0;
int illegal = 0;
while(scanf("%s",input) != EOF)
{
memset(ip, -1, 4);
memset(mask, -1, 4);
sscanf(input, "%d.%d.%d.%d~%d.%d.%d.%d", ip, ip + 1, ip + 2, ip + 3, mask, mask + 1, mask + 2, mask + 3);
if(ip[0] == 0 || ip[0] == 127)
{
continue;
}
int errMaskCode = maskIsIllegal(mask, 4);
int errIpCode = ipIsIllegal(ip, 4);
// printf("errMaskCode = %d, errIpCode = %d \n", errMaskCode, errIpCode);
if(errMaskCode != 0 || errIpCode != 0)
{
// illegal++;
numErrMask++;
continue;
}
if(ip[0] == -1 || ip[1] == -1 || ip[2] == -1 || ip[3] == -1)
{
numErrIP++;
}
else if(ip[0] >= 1 && ip[0] <= 126) //A类
{
numA++;
if(ip[0] == 10) //第一种私网络IP 10.0.0.0到10.255.255.255
{
numPrivateIp++;
}
}
else if(ip[0] >= 128 && ip[0] <= 191) //B类
{
numB++;
if(ip[0] == 172 && ip[1] >= 16 && ip[1] <= 31) //第二种私有网络IP 172.16.0.0到172.31.255.255
{
numPrivateIp++;
}
}
else if(ip[0] >= 192 && ip[0] <= 223) //C类
{
numC++;
if(ip[0] == 192 && ip[1] == 168) //第三种私有网络IP 192.168.0.0到192.168.255.255
{
numPrivateIp++;
}
}
else if(ip[0] >= 224 && ip[0] <= 239) //D类
{
numD++;
}
else if(ip[0] >= 240 && ip[0] <= 255) //E类
{
numE++;
}
}
printf("%d %d %d %d %d %d %d", numA, numB, numC, numD, numE, numErrMask, numPrivateIp);
return 0;
}