#include <stdio.h> #define size 15 #include <string.h> int numip[7]={0}; //储存输出值 int istrueip(char *ip,int voild){ //这里ip判断的很细 int num[5]={0,-1,-1,-1,-1},k=1,temp=0,flag=0,len=strlen(ip); for(int i=0;i<len;i++){ //.,四个整数足够 if(ip[i]=='.'){ num[0]++; } } if(num[0]!=3){ return 5; } for(int i=0;i<len;i++){ if(i<len-1 && ip[i]==0 && ip[i+1]==0){ //整数01.2.2.2,判错误,01错了 return 5; } temp=0,flag=0; while('0'<=ip[i] && ip[i]<='9' && i<len){ //记这个整数 temp=temp*10+(ip[i]-'0'); i++; flag=1; //flag标记有整数 } if(flag==1){num[k]=temp;} if(num[k]>255||num[k]<0){ //超出255错误,初始-1,没变错误 return 5; } k++; } if((voild)&&(num[1]==10 || (num[1]==172&&num[2]>=16&&num[2]<=31) || (num[1]==192&&num[2]==168))){ //参数voild ,表示私有变不变,因为0和172开头的特性 numip[6]++; } if(num[1]>=1&&num[1]<=126){ //下面是五类的分类 return 0; } if(num[1]>=128 && num[1]<=191){ return 1;} if(num[1]>=192 &&num[1]<=223){return 2;} if(num[1]>=224 &&num[1]<=239){return 3;} if(num[1]>=240 &&num[1]<=255){return 4;} return 7; } int istrueipx(char*ipx){ int num[5]={0,-1,-1,-1,-1},k=1,temp=0,flag=0,len=strlen(ipx); int is1[8]={0,128,192,224,240,248,252,254}; //这个是前一后0的所有数 for(int i=0;i<len;i++){ if(ipx[i]=='.'){ //和ip一样 num[0]++; } } if(num[0]!=3){ return 5; } for(int i=0;i<len;i++){ temp=0; while('0'<=ipx[i] && ipx[i]<='9' && i<len){ temp=temp*10+(ipx[i]-'0'); i++; } num[k]=temp; k++; } //掩码四个数存入 for(int i=1;i<5;i++){ if(num[i]!=255){ //第一个不为255的数, for(int j=0;j<8;j++){ //判断前一后0是不是 if(num[i]!=is1[j]){ continue; } flag=1; //flag标志 是 break; } if(flag==0){return 5;} //不是就表示错误掩码 for(int j=i+1;j<5;j++){ //是的话,后0判断注意这里i+1,没有+1第8个示例过不去 if(num[j]!=0){return 5;} } } } if(num[1]==255&&num[2]==255&&num[3]==255&&num[4]==255){ //两个特例错误 return 5; } if(num[1]==0&&num[2]==0&&num[3]==0&&num[4]==0){ return 5; } return 7; } int main() { char input[2*size+1]={'\0'},ip[size]={'\0'},ipx[size]={'\0'}; int temp=0; while (scanf("%s", input) != EOF) { // 注意 while 处理多个 case //输入 // 64 位输出请用 printf("%lld") to for(int i=0;i<strlen(input);i++){ //找到~ if(input[i]=='~'){ strncpy(ip,input,i); //前面的给ip strcpy(ipx,input+i+1); //后面的给ipx,掩码 break; } } temp=istrueipx(ipx); //先判断掩码 if(temp==7){ temp=istrueip(ip,1); //掩码正确,归类ip if(temp<7){ numip[temp]++; } } else{ //掩码不正确 temp=istrueip(ip,0); //参数0,不让他私有地址判断 if(temp!=7) numip[5]++; //ip返回的7是0...和127.....,,非7就是掩码错误,错误+1 } strncpy(ip,"",strlen(ip)); //字符串要重置 strncpy(ipx,"",strlen(ipx)); } for(int i=0;i<7;i++){ //0是A,1是B,2是C,按顺序 printf("%d ",numip[i]); } return 0; }