C/C++编程题之识别有效的IP地址和掩码并进行分类统计

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6


在牛客上刷到”识别有效的IP地址和掩码并进行分类统计“这道题,现在将通过的代码贴一下,供大家参考。

请解析IP地址和对应的掩码,进行分类识别。要求按照A/B/C/D/E类地址归类,不合法的地址和掩码单独归类。

所有的IP地址划分为 A,B,C,D,E五类

A类地址1.0.0.0~126.255.255.255;

B类地址128.0.0.0~191.255.255.255;

C类地址192.0.0.0~223.255.255.255;

D类地址224.0.0.0~239.255.255.255;

E类地址240.0.0.0~255.255.255.255

 

私网IP范围是:

10.0.0.0~10.255.255.255

172.16.0.0~172.31.255.255

192.168.0.0~192.168.255.255

 

子网掩码为二进制下前面是连续的1,然后全是0。(例如:255.255.255.32就是一个非法的掩码)

注意二进制下全是1或者全是0均为非法

 

注意:

1. 类似于【0.*.*.*】和【127.*.*.*】的IP地址不属于上述输入的任意一类,也不属于不合法ip地址,计数时可以忽略

2. 私有IP地址和A,B,C,D,E类地址是不冲突的

#include <stdio.h>
#include <string.h>

void ip2num(char* str,int* ip)
{
memset(ip,0,sizeof(int)*4);
int i,j;
i=j=0;
for(;i<4;++i){
for(;str[j]!='.'&&str[j];++j){
ip[i]=ip[i]*10+str[j]-'0'; }
++j;
}
return;
}

void get_ip_mask(char* str, char* ip, char* mask)
{
char *t=strchr(str,'~');
*t=0;
strcpy(ip,str);
strcpy(mask,t+1);
return;
}

int checkChar(char* ip)
{
int len=strlen(ip);
if(len<7)
return 0;
for(int i=0;i<len;++i)
if(!((ip[i]>='0'&&ip[i]<='9')||ip[i]=='.')){
return 0;
}
int n=0;
for(int i=0;i<len;++i)
if(ip[i]=='.')
++n;
if(n!=3)
return 0;
for(int i=0;i<len;++i)
if(ip[i]==';'&&ip[i+1]==';')
return 0;
return 1;
}

int checkIP(char* ip)
{
int ret=0;
if(!checkChar(ip)){
return 0;
}
int ip_num[4];
memset(ip_num,0,sizeof(int)*4);
ip2num(ip,ip_num);
for(int i=0;i<4;++i)
if(ip_num[i]>255)
return 0;
if(ip_num[0]==127)
return -1;
if(ip_num[0]==0)
return -1;
if(ip_num[0]<=126)
ret=1;
else if(ip_num[0]>=128&&ip_num[0]<=191)
ret=2;
else if(ip_num[0]>=192&&ip_num[0]<=223)
ret=3;
else if(ip_num[0]>=224&&ip_num[0]<=239)
ret=4;
else
ret=5;
if(ip_num[0]==10||(ip_num[0]==172&&ip_num[1]>=16&&ip_num[1]<=31)||(ip_num[0]==192&&ip_num[1]==168))
ret+=5;
return ret;
}

int checkMask(char* mask)
{
if(!checkChar(mask))
return 0;
int mask_num[4];
ip2num(mask,mask_num);
for(int i=0;i<4;++i)
if(mask_num[i]>255)
return 0;
unsigned int mask_int;
char* tmp_int=(char*)&mask_int;
char* tmp_arr;
for(int i=0;i<4;++i){
tmp_arr=(char*)&mask_num[3-i];
tmp_int[i]=tmp_arr[0];
}
int tmp=mask_int;
while(mask_int&&!(mask_int&1))
mask_int>>=1;
if(tmp==mask_int)
return 0;
while(mask_int){
if((mask_int&1)==0)
return 0;
mask_int=mask_int>>1;
}
return 1;
}

int main()
{
char str[100];
int a,b,c,d,e,err,prv;
a=b=c=d=e=err=prv=0;
while(gets(str)!=NULL){
char ip[50],mask[50];
memset(ip,0,50);
memset(mask,0,50);
get_ip_mask(str,ip,mask);
int class=checkIP(ip);
if(!class){
++err;
continue;
}
if(!checkMask(mask)){
++err;
continue;
}
if(class>5){
++prv;
class-=5;
}
switch(class){
case 1:
++a;
break;
case 2:
++b;
break;
case 3:
++c;
break;
case 4:
++d;
break;
case 5:
++e;
break;
default:
break;
}
}
printf("%d %d %d %d %d %d %d\n",a,b,c,d,e,err,prv);
}

 

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: c++