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