子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据。
子网掩码与IP地址结构相同,是32位二进制数,其中网络号部分全为“1”和主机号部分全为“0”。利用子网掩码可以判断两台主机是否中同一子网中。若两台主机的IP地址分别与它们的子网掩码相“与”后的结果相同,则说明这两台主机在同一子网中。
输入: String Mask: 子网掩码,格式:“255.255.255.0”;
* String ip1: 计算机1的IP地址,格式:“192.168.0.254”;
* String ip2: 计算机2的IP地址,格式:“192.168.0.1”;
输出: 0:IP1与IP2属于同一子网络; 1:IP地址或子网掩码格式非法; 2:IP1与IP2不属于同一子网络
#include <iostream>
#include <string>
using namespace std;
void checkNetSegment(string mask,string ip1,string ip2)
{
int count1=0, count2=0, count3=0;
int count4=0, count5=0, count6=0;
int i=0;
for (i=0;i<mask.size();i++)
{
if (mask[i]=='.'&&mask[i+1]!='.')
{
count1++;
}
}
for (i=0;i<ip1.size();i++)
{
if (ip1[i]=='.'&&ip1[i+1]!='.')
{
count2++;
}
}
for (i=0;i<ip2.size();i++)
{
if (ip2[i]=='.'&&ip2[i+1]!='.')
{
count3++;
}
}
for (i=0;i<mask.size();i++)
{
if (mask[i]=='.')
{
count4++;
}
}
for (i=0;i<ip1.size();i++)
{
if (ip1[i]=='.')
{
count5++;
}
}
for (i=0;i<ip2.size();i++)
{
if (ip2[i]=='.')
{
count6++;
}
}
if ((count1==count2&&count2==count3&&count3==3) &&(count4==count5&&count5==count6&&count6==3 ))
{
string maskStr[4],IP1Str[4],IP2Str[4];
int flag1=0;
int k=0;
i=0;
int len = mask.size();
while(i<len)
{
int tmp =i;
while(tmp<len&&isdigit(mask[tmp]))
tmp++;
if (tmp <= mask.size())
{
if ((tmp<len&&mask[tmp]=='.')||(tmp==len))
{
maskStr[k++] = mask.substr(i,tmp-i);
i = tmp+1;
}else{
cout<<"1"<<endl;
return;
}
}
}
int flag2=0;
k=0;
i=0;
len = ip1.size();
while(i<len)
{
int tmp =i;
while(tmp<len&&isdigit(ip1[tmp]))
tmp++;
if((tmp<len&&ip1[tmp]=='.')||(tmp==len))
{
IP1Str[k++] = ip1.substr(i,tmp-i);
i = tmp+1;
}else{
cout<<"1"<<endl;
return;
}
}
int flag3=0;
k=0;
i=0;
len = ip2.size();
while(i<len)
{
int tmp =i;
while(tmp<len&&isdigit(ip2[tmp]))
tmp++;
if ((tmp<len&&ip2[tmp]=='.')||(tmp==len))
{
IP2Str[k++] = ip2.substr(i,tmp-i);
i = tmp+1;
}else{
cout<<"1"<<endl;
return;
}
}
for (i=0;i<4;i++)
{
if (atoi(maskStr[i].c_str())>=0&&atoi(maskStr[i].c_str())<256)
{
flag1++;
}
}
for (i=0;i<4;i++)
{
if (atoi(IP1Str[i].c_str())>=0&&atoi(IP1Str[i].c_str())<256)
{
flag2++;
}
}
for (i=0;i<4;i++)
{
if (atoi(IP2Str[i].c_str())>=0&&atoi(IP2Str[i].c_str())<256)
{
flag3++;
}
}
if (flag1==flag2&&flag2==flag3&&flag3==4)
{
for (i=0;i<4;i++)
{
if ((atoi(IP1Str[i].c_str())&atoi(maskStr[i].c_str()))!= (atoi(maskStr[i].c_str())&atoi(IP2Str[i].c_str())))
{
cout<<"2"<<endl;
return;
}
}
cout<<"0"<<endl;
}else{
cout<<"1"<<endl;
}
}else{
cout<<"1"<<endl;
}
}
int main()
{
string s1,s2,s3;
while(1)
{
cin>>s1>>s2>>s3;
checkNetSegment(s1,s2,s3);
}
return 0;
}