述 | |
---|---|
知识点 | 字符串 |
运行时间限制 | 10M |
内存限制 | 128 |
输入 | 输入子网掩码、两个ip地址 |
输出 | 得到计算结果 |
样例输入 | 255.255.255.0 192.168.224.256 192.168.10.4 |
样例输出 | 1 |
1.首先第一步:输入的子网掩码和IP地址都要进行字符串分割,分隔符为".",因此定义字符串分割函数并实现
vector<string> mySplit(string s, string pattern){
}
2.第二步:判断子网掩码或者IP地址是否合法,由mySplit函数得到的各字段均在[0,255]之间,注意stringstream的使用,将字符串转为int型
3.第三步:
如果三个输入均合法,判断是否为同一子网,要将两个IP地址与子网掩码进行与操作,由于子网掩码前三个字段是255,二进制表示全为1,判断与操作结果是否一致,可直接判断两个IP地址的前三个字段是否一致,而子网掩码第四个字段是0,二进制表示全为0,与操作结果肯定为0.
如果任一输入不合法,则返回1
源代码:
- #include <iostream>
- #include <string>
- #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);
- string tmp = s.substr(i, pos - i);
- res.push_back(tmp);
- i = pos + pattern.size();
- }
- return res;
- }
- bool isOK(string s, vector<string>& strs){
- strs = mySplit(s,".");
- if(strs.size() != 4)return false;
- else{
- for(int i = 0; i < strs.size(); i++){
- stringstream ss;
- int nums;
- ss << strs[i];
- ss >> nums;
- if(nums > 255 || nums < 0)
- return false;
- }
- return true;
- }
- }
- int checkNetSegment(string mask, string ip1, string ip2){
- vector<string> vecMask, vecIp1, vecIp2;
- if(isOK(mask,vecMask) && isOK(ip1,vecIp1) && isOK(ip2,vecIp2)){
- for(int i = 0; i < 4; i++){
- if((i < 3 && vecMask[i] == "255" && vecIp1[i] != vecIp2[i])||(i == 3 && vecMask[i] != "0")||(i < 3 && vecMask[i] != "255"))
- return 2;
- }
- return 0;
- }
- else
- return 1;
- }
- void main(){
- string mask,ip1,ip2;
- cin >> mask;
- cin >> ip1;
- cin >> ip2;
- cout << checkNetSegment(mask,ip1,ip2) << endl;
- }