这个题的话,就是来回转换比较麻烦,其他的其实没有什么问题,直接放在函数里面了,所以写的会比较短一些

#include<iostream>
using namespace std;
//ip转数字
int count=0;
bool transform(string str,int a[]){
    int index=0;
    for(int i=0;i<str.length();){
        int tmp=0;
        while(str[i]>='0'&&str[i]<='9'){
            tmp=tmp*10+str[i]-'0';
            i++;
        }
        a[index++]=tmp;
        if(tmp>255) return false;
        if(str[i]=='\0'){
            break;
        }else if(str[i]=='.'){
            i++;
        }else if(str[i]=='-'){
            return false;
        }
    }
    return true;
} 

int main(){
    string subnet,ip1,ip2;
    int sn[5],ipb1[5],ipb2[5];
    while(cin>>subnet>>ip1>>ip2){
        if(!(transform(subnet,sn)&&transform(ip1,ipb1)&&transform(ip2,ipb2))){
            //判断是否有负值不合法的情况 
            cout<<"1"<<endl;
        }else{
            for(int i=0;i<4;i++){
                ipb1[i]=ipb1[i]&sn[i];
                ipb2[i]=ipb2[i]&sn[i];
            }
            //判断子网掩码不合法情况或者两个不相同的情况 
            int flag=0;
            for(int i=0;i<4;i++){
                if(sn[i]!=255&&sn[i]!=0&&sn[i]!=252){
                    flag=1;
                    break;
                } 
            }
            if(flag==0){
                for(int i=0;i<4;i++){
                    if(ipb1[i]!=ipb2[i]){
                        flag=2;
                        break;
                    }
                }                
            }
            cout<<flag<<endl;
        }    
    }
    return 0;
}