直接按规则来就行,主要是要考虑到各种情况。
#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; }