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

在牛客上刷到”识别有效的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);
}

猜你喜欢

转载自blog.csdn.net/lzyzuixin/article/details/111387214
今日推荐