思路:
1. 判断子网掩码和IP地址的合法性(四个字段,每个字段在0~255);
2.题目原本是需要作“与”的运算,但是实际上,子网掩码每个字段不是255就是0(255表示网络号,0表示主机号),因此,当子网掩码的某个字段为255时,判断IP地址的相应字段是否相同即可。
代码:
#include <string>
#include <iostream>
#include <sstream>
#include <vector>
using namespace std;
//分割字符串
vector<string> mysplit(string s, string pattern){
vector<string> res;
s += pattern;
int size = s.size();
for(int i = 0; i < size;){
int pos = s.find(pattern,i);
if(pos < size){
string temp = s.substr(i,pos - i);
res.push_back(temp);
i = pos + pattern.size();
}
}
return res;
}
//判断子网掩码或IP地址的合法性
bool isOk(string s, vector<string> &res){
res = mysplit(s,".");
int size = res.size();
if(size != 4) return false;
for(int i = 0; i < size; i++){
stringstream ss;
int num;
ss << res[i]; //把原始数据扔进去
ss >> num; //根据num的类型扔出来
if(num > 255 || num < 0)
return false;
}
return true;
}
int checkNetSegment(string mask, string ip1, string ip2)
{
/*在这里实现功能*/
vector<string> vecMask, vecIp1, vecIp2;
bool test = isOk(mask,vecMask);
bool tes1t = isOk(ip1,vecIp1);
bool test2 = isOk(ip2,vecIp2);
if(isOk(mask,vecMask) && isOk(ip1,vecIp1) && isOk(ip2,vecIp2)){
for(int i = 0; i < 4; i++){
if(vecMask[i] == "255" && vecIp1[i] != vecIp2[i])
return 2;
}
}else
return 1;
return 0;
}
void main(){
string mask,ip1,ip2;
cin >> mask;
cin >> ip1;
cin >> ip2;
cout << checkNetSegment(mask,ip1,ip2);
}