这个题的话,就是来回转换比较麻烦,其他的其实没有什么问题,直接放在函数里面了,所以写的会比较短一些
#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; }