题解 | #识别有效的IP地址和掩码并进行分类统计#

识别有效的IP地址和掩码并进行分类统计

https://www.nowcoder.com/practice/de538edd6f7e4bc3a5689723a7435682

#include <stdio.h>
#include <string.h>
int isip(int ip[])//判定是否是合法IP,以及IP分类
{
    int flag=-1;
    if((ip[0]==0)||(ip[0]==127))
    {
        flag=-2;
    }
    else if((ip[0]>=1)&&(ip[1]>=0)&&(ip[2]>=0)&&(ip[3]>=0)&&(ip[0]<=255)&&(ip[1]<=255)&&(ip[2]<=255)&&(ip[3]<=255))
    {
        if(ip[0]>=1&&ip[0]<=126)
        {
            flag=1;
        }
        else if(ip[0]>=128&&ip[0]<=191)
        {
            flag=2;
        }
        else if(ip[0]>=192&&ip[0]<=223)
        {
            flag=3;
        }
        else if(ip[0]>=224&&ip[0]<=239)
        {
            flag=4;
        }
        else if(ip[0]>=240&&ip[0]<=255)
        {
            flag=5;
        }

    }
    else {
        flag=0;
    }
    return flag;
}
int isdns(int dns[])//判断是否为合法子网掩码
{ 

    int flag=-1;
    if((isip(dns))<=0)
    {
        flag=0;
    }
    unsigned int a=0;
    unsigned int b=0;
    a=(dns[0]<<24)+(dns[1]<<16)+(dns[2]<<8)+dns[3];
    b=(~a)+1;
    if((b&(b-1))==0)
    {
        flag=1;
    }
    else {
    flag=0;
    }
    if(a==0||((dns[0]==255)&&(dns[1]==255)&&(dns[2]=255)&&(dns[3]==255)))
    {
    flag=0;
    }
    return flag;
}
int ispri(int ip[])//判断是否为私有ip
{
    int flag=-1;
    if((isip(ip))>=1)
    {
        if((ip[0]==10)||((ip[0]==172)&&((ip[1]>=16)&&(ip[1]<=31))||((ip[0]==192)&&(ip[1]==168))))
        {
            flag=1;
        }
    }
    return flag;
}

int main()
{
    int fa=0,fb=0,fc=0,fd=0,fe=0,ferr=0,fpri=0;
    int ip[4]={0};
    int dns[4]={0};
    char str[200]={0};
    while(scanf("%s",str)!=EOF)
    {
        memset(ip,-1,4*sizeof(int));
        memset(dns,-1,4*sizeof(int));
        sscanf(str,"%d.%d.%d.%d~%d.%d.%d.%d",&ip[0],&ip[1],&ip[2],&ip[3],&dns[0],&dns[1],&dns[2],&dns[3]);
        if((ip[0]==0)||(ip[0]==127))//判断是否为不计数ip
    {
        continue;
    }
        if(isdns(dns)<=0)//掩码合法否
        {
            ferr++;
            continue;
        }
        else if(isip(ip)<=0)//ip合法否
        {
            ferr++;
            continue;
        }
        else//ip分类
        {
            switch(isip(ip))
            {
                case 1:
                fa++;
                break;
                case 2:fb++;break;
                case 3:fc++;break;
                case 4:fd++;break;
                case 5:fe++;break;
            }
            if(ispri(ip)>=1)
            {
                fpri++;
            }        
        }
    }
    printf("%d %d %d %d %d %d %d",fa,fb,fc,fd,fe,ferr,fpri);//输出结果
}

全部评论

相关推荐

吃不饱的肱二头肌很想退休:tnnd 我以为选妹子呢,亏我兴高采烈的冲进来😠
投递快手等公司10个岗位
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务