题目:判断两个IP是否属于同一个子网
子网掩码是用来判断任意两台计算机的IP地址是否属于同一个子网的根据。
利用子网掩码与IP地址结构相同,是32位二进制,其中网络好全部为“1”和主机号全为“0”。
利用子网掩码可以判断两台主机是否在同一个子网中。若两台主机的IP地址分别于他们的子网掩码相“与”后的结果相同,则说明这两台主机在同一个子网中
#include<iostream>
#include<string>
#include<cctype>
using namespace std;
bool checkNetSegment(string mask,string IP1,string IP2)
{
int count1=0,count2=0,count3=0;
string str1[4],str2[4],str3[4];
for(int i=0;i<mask.size();i++)
{
if(mask[i]=='.' && mask[i+1]!='.')
count1++;
}
for(int i=0;i<IP1.size();i++)
{
if(IP1[i]=='.' && IP1[i+1]!='.')
count2++;
}
for(int i=0;i<IP2.size();i++)
{
if(IP2[i]=='.' && IP2[i+1]!='.')
count3++;
}
if(count1==3 && count2==3 && count3==3)
{
int i=0,flag1=0;
int k=0;
while(i<mask.size())
{
int tmp=i;
while(isdigit(mask[tmp]))
tmp++;
str1[k]=mask.substr(i,tmp-i);
k++;
i=tmp+1;
}
i=0;
int flag2=0;
k=0;
while(i<IP1.size())
{
int tmp=i;
while(isdigit(IP1[tmp]))
tmp++;
str2[k]=IP1.substr(i,tmp-i);
k++;
i=tmp+1;
}
i=0;
int flag3=0;
k=0;
while(i<IP2.size())
{
int tmp=i;
while(isdigit(IP2[tmp]))
tmp++;
str3[k]=IP2.substr(i,tmp-i);
k++;
i=tmp+1;
}
for(int i=0;i<4;i++)
{
if(atoi(str1[i].c_str())>=0 && atoi(str1[i].c_str())<256)
flag1++;
if(atoi(str2[i].c_str())>=0 && atoi(str2[i].c_str())<256)
flag2++;
if(atoi(str3[i].c_str())>=0 && atoi(str3[i].c_str())<256)
flag3++;
}
if(flag1==4 && flag2==4 && flag3==4)
{
for(int i=0;i<4;i++)
{
if((atoi(str1[i].c_str())&atoi(str2[i].c_str()))!=(atoi(str1[i].c_str()) & atoi(str3[i].c_str())))
return false;
}
return true;
}
return false;
}
return false;
}
int main()
{
string s1,s2,s3;
cin>>s1>>s2>>s3;
if(checkNetSegment(s1,s2,s3))
cout<<1<<endl;
else
cout<<0<<endl;
}