直接按规则来就行,主要是要考虑到各种情况。
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef union __Code_tu {
uint32_t all;
uint8_t segment[4];
} Code_tu;
typedef union __IPType_tu {
uint8_t all;
struct {
uint8_t isValid:1;
uint8_t type:3;
uint8_t isPrivate:1;
uint8_t reserved:3;
} bit;
} IPType_tu;
Code_tu ip = {};
Code_tu mask = {};
IPType_tu checkIP(uint32_t ip)
{
IPType_tu result = {};
result.all = 0;
result.bit.isValid = 1;
if (ip>=0x01000000 && ip<=0x7EFFFFFF) {
result.bit.type = 1;
} else if (ip>=0x80000000 && ip<=0xBFFFFFFF) {
result.bit.type = 2;
} else if (ip>=0xC0000000 && ip<=0xDFFFFFFF) {
result.bit.type = 3;
} else if (ip>=0xE0000000 && ip<=0xEFFFFFFF) {
result.bit.type = 4;
} else if (ip>=0xF0000000 && ip<=0xFFFFFFFF) {
result.bit.type = 5;
} else if (ip>=0x00000000 && ip<=0x00FFFFFF) {
} else if (ip>=0x7F000000 && ip<=0x7FFFFFFF) {
} else {
result.bit.isValid = 0;
}
if ((ip>=0x0A000000 && ip<=0x0AFFFFFF)
|| (ip>=0xAC100000 && ip<=0xAC1FFFFF)
|| (ip>=0xC0A80000 && ip<=0xC0A8FFFF)) {
result.bit.isPrivate = 1;
} else {}
return result;
}
bool checkMask(uint32_t mask)
{
uint32_t tempMask = 0x80000000;
bool result = true;
bool zero = false;
if (mask==0x0 || mask==0xFFFFFFFF) {
result = false;
} else {
zero = false;
for (tempMask=0x80000000; tempMask!=0; tempMask>>=1) {
if ((tempMask&mask) && zero) {
result = false;
break;
} else if ((tempMask&mask) && (!zero)) {
continue;
} else {
zero = true;
}
}
}
return result;
}
int main() {
uint32_t A=0,B=0,C=0,D=0,E=0;
uint32_t err=0,priv=0;
char s[32] = {};
bool isValidMask = false;
bool errFlag = false;
uint32_t start=0, end=0, length=0;
uint32_t temp=0, loca=0;
IPType_tu ipType;
while (scanf("%s", s) != EOF) {
length = strlen(s);
ip.all=0,mask.all=0,loca=0;
start=0, end=0;
errFlag = false;
for (int i=0; i<length; ++i) {
if ((loca<3 && s[i]=='.') // IP 前3段
||(loca==3 && s[i]=='~') // IP 第4段
||(loca<7 && s[i]=='.') // 掩码前3段
||(loca==7 && i==length-1) // 掩码第4段
) {
if (i == length-1) { end = i; }
else { end = i-1; }
if(start > end) {
err++;
errFlag = true;
} else {
temp = 0;
for (int j=start; j<=end; ++j) {
temp = temp*10+s[j]-'0';
}
if (temp > 255) {
err++;
errFlag = true;
} else {
if (loca <= 3) {
ip.all = (ip.all << 8) + temp;
} else {
mask.all = (mask.all << 8) + temp;
}
start = i+1;
loca++;
}
}
} else if ((loca==3 && s[i]=='.') || (loca==7 && s[i]=='.')) { // IP 或掩码大于4段
err++;
errFlag = true;
} else {}
if (errFlag) { break; } else {}
}
if (!errFlag) {
ipType = checkIP(ip.all);
isValidMask = checkMask(mask.all);
if (ipType.bit.isValid == 0) {
err++;
} else {
if (ipType.bit.type != 0) {
if (isValidMask) {
switch (ipType.bit.type) {
case 1: A++; break;
case 2: B++; break;
case 3: C++; break;
case 4: D++; break;
case 5: E++; break;
default: break;
}
if (ipType.bit.isPrivate == 1) {
priv++;
} else {}
} else {
err++;
}
} else {}
}
}
memset(s, 0, sizeof(char)*length);
}
printf("%d %d %d %d %d %d %d", A,B,C,D,E,err,priv);
return 0;
}

京公网安备 11010502036488号