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

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

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

1.scanf("%d.%d.%d.%d~%d.%d.%d.%d",ip,),这样可以把初值复位为非正常范围,然后判定该值有没有改变从而确认是否赋值成功,是否是正确的格式
2.掩码可以全部取反后加1,看是否只有一位数为1来判定是否是合法掩码

#include<stdio.h>
int main(){
    unsigned char ipaddress_msak[8]={0},line[32]={0};
    int i=0,j=0,k=0,m=0,start=0,end=0,len=0,cnt_A=0,cnt_B=0,cnt_C=0,cnt_D=0,cnt_E=0,cnt_pri=0,cnt_err=0,pre_h=1,err_sta=0;
        
    while(scanf("%s ",line)!=EOF){
        for(i=0,start=0;i<32;i++){
            if(line[i]=='.'){
                end=i-1;
                len=end-start;
                if((len>=0)&&(len<=2)){
                    for(j=0;j<=len;j++){
                        if((line[start+j]<='9')&&(line[start+j]>='0')){
                            ipaddress_msak[k]*=10;
                            ipaddress_msak[k]+=(line[start+j]-'0');
                        }else{
                            err_sta=1;
                            break;
                        }
                    }
                }else{
                    err_sta=1;
                    break;
                }
                start=i+1;
                k++;
            }else if(line[i]=='~'){
                end=i-1;
                len=end-start;
                if((len>=0)&&(len<=2)){
                    for(j=0;j<=len;j++){
                        if((line[start+j]<='9')&&(line[start+j]>='0')){
                            ipaddress_msak[k]*=10;
                            ipaddress_msak[k]+=(line[start+j]-'0');
                        }
                        else{
                            err_sta=1;
                            break;
                        }
                    }
                }else{
                    err_sta=1;
                    break;
                }
                start=i+1;
                k=4;
            }else if(line[i]=='\0'){
                end=i-1;
                len=end-start;
                if((len>=0)&&(len<=2)){
                    for(j=0;j<=len;j++){
                        if((line[start+j]<='9')&&(line[start+j]>='0')){
                            ipaddress_msak[k]*=10;
                            ipaddress_msak[k]+=(line[start+j]-'0');
                        }else{
                            err_sta=1;
                            break;
                        }
                    }
                }
                else{
                    err_sta=1;
                    break;
                }
                
                break;
            }
        }
        
        if(err_sta==1){
            cnt_err++;
        }else{
            for(k=0;k<4;k++){
                if((ipaddress_msak[4+k]!=0xFF)&&(pre_h==1)){
                    for(m=7;m>=0;m--){
                        //printf("%X %X \n",(ipaddress_msak[4+k]>>m)&0x01,(ipaddress_msak[4+k]&(1<<m)));
                        if((((ipaddress_msak[4+k]>>m)&0x01)==0)&&(pre_h==1)){
                            pre_h=0;
                        }else if(((ipaddress_msak[4+k]&(1<<m))!=0)&&(pre_h==0)){
                            err_sta=1;
                            break;
                        }
                    }
                    if(err_sta==1){
                        break;
                    }
                }else if((ipaddress_msak[4+k]!=0x00)&&(pre_h==0)){
                    err_sta=1;
                    break;
                }
            }
            if((ipaddress_msak[4]==0)&&(ipaddress_msak[5]==0)&&(ipaddress_msak[6]==0)&&(ipaddress_msak[7]==0)){
                err_sta=1;
            }else if((ipaddress_msak[4]==0xFF)&&(ipaddress_msak[5]==0xFF)&&(ipaddress_msak[6]==0xFF)&&(ipaddress_msak[7]==0xFF)){
                err_sta=1;
            }
            if((ipaddress_msak[0]>=1)&&(ipaddress_msak[0]<=126)){
                if(err_sta==1){
                    cnt_err++;
                }else{
                    cnt_A++;
                    if(ipaddress_msak[0]==10){
                        cnt_pri++;
                    }
                }
            }else if((ipaddress_msak[0]>=128)&&(ipaddress_msak[0]<=191)){
                if(err_sta==1){
                    cnt_err++;
                }else{
                    cnt_B++;
                    if((ipaddress_msak[0]==172)&&(ipaddress_msak[1]>=16)&&(ipaddress_msak[1]<=31)){
                        cnt_pri++;
                    }
                }
            }else if((ipaddress_msak[0]>=192)&&(ipaddress_msak[0]<=223)){
                if(err_sta==1){
                    cnt_err++;
                }else{
                    cnt_C++;
                    if((ipaddress_msak[0]==192)&&(ipaddress_msak[1]==168)){
                        cnt_pri++;
                    }
                }
            }else if((ipaddress_msak[0]>=224)&&(ipaddress_msak[0]<=239)){
                if(err_sta==1){
                    cnt_err++;
                }else{
                    cnt_D++;
                }
            }else if((ipaddress_msak[0]>=240)&&(ipaddress_msak[0]<=255)){
                if(err_sta==1){
                    cnt_err++;
                }else{
                    cnt_E++;
                }
            }else{
                //cnt_err++;
            }
            err_sta=0;
            memset(ipaddress_msak,0,8);
            k=0;
            pre_h=1;
        }
    }
    printf("%d %d %d %d %d %d %d",cnt_A,cnt_B,cnt_C,cnt_D,cnt_E,cnt_err,cnt_pri);
    return 0;
}
全部评论

相关推荐

02-10 12:23
已编辑
新余学院 C++
采集想要offer:专业技能那里要一条一条的列出来吧,感觉你项目很厉害了,但是如果你不写技术栈面试官对你项目不太懂的话都没办法问你八股😂C++都是基架岗,都是一群9✌🏻在卷,我觉得你要是有时间学个go把MySQL和redis写上去找个开发岗吧
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务