[华为机试练习题]54.判断任意两台计算机的IP地址是否属于同一子网络

题目

描述:

子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据。
最为简单的理解就是两台计算机各自的IP地址与子网掩码进行AND运算后,如果得出的结果是相同的,则说明这两台计算机是处于同一个子网络上的,可以进行直接的通讯。就这么简单。

请看以下示例:
运算演示之一:

IP地址:192.168.0.1
子网掩码:255.255.255.0
AND运算
转化为二进制进行运算:
IP地址:11010000.10101000.00000000.00000001 
子网掩码:11111111.11111111.11111111.00000000 
AND运算:11010000.10101000.00000000.00000000 
转化为十进制后为: 192.168.0.0

运算演示之二:

IP地址:192.168.0.254 
子网掩码:255.255.255.0 
AND运算
转化为二进制进行运算:
IP地址:11010000.10101000.00000000.11111110 
子网掩码:11111111.11111111.11111111.00000000 
AND运算:11010000.10101000.00000000.00000000 
转化为十进制后为:192.168.0.0

通过以上对两台计算机IP地址与子网掩码的AND运算后,我们可以看到它运算结果是一样的。均为192.168.0.0,所以这二台计算机可视为是同一子网络。

接口说明
原型:

int IsSameSubNetwork(char * pcIp1, char * pcIp2, char * pcSubNetworkMask);

输入参数:

char * pcIP1: 计算机1的IP地址,格式:“192.168.0.254”
char * pcIP2: 计算机2的IP地址,格式:“192.168.0.1”
char * pcSubNetworkMask: 子网掩码,格式:“255.255.255.0”

返回值:

0:IP1与IP2不属于同一子网络。
1:IP1与IP2属于同一子网络。

练习阶段:

初级 

代码

/*--------------------------------------- * 日期:2015-07-05 * 作者:SJF0115 * 题目:判断任意两台计算机的IP地址是否属于同一子网络 * 来源:华为机试练习题 -----------------------------------------*/
#include <iostream>
#include "OJ.h"
#include <string>
#include <vector>
using namespace std;

/* 功能: 判断两台计算机IP地址是同一子网络。 原型: int IsSameSubNetwork(char * pcIp1, char * pcIp2, char * pcSubNetworkMask); 输入参数: char * pcIP1: 计算机1的IP地址,格式:“192.168.0.254”; char * pcIP2: 计算机2的IP地址,格式:“192.168.0.1”; char * pcSubNetworkMask: 子网掩码,格式:“255.255.255.0”; 返回值: 0:IP1与IP2不属于同一子网络; 1:IP1与IP2属于同一子网络; */

// 检查子网掩码和IP格式是否正确 并返回分段
bool CheckIP(string str,vector<int> &numVec){
    int size = str.size();
    int pointCount = 0;
    string::size_type index = 0;
    int prePoint = 0;
    vector<string> part;
    while((index = str.find_first_of('.',index)) != string::npos){
        //..之间有数字
        if(index > prePoint){
            part.push_back(str.substr(prePoint,index-prePoint));
        }//if
        ++index;
        prePoint = index;
        ++pointCount;
    }//while
    if(prePoint < size){
        part.push_back(str.substr(prePoint));
    }//if

    int partSize = part.size();
    if(partSize != 4){
        return false;
    }//if

    // 判断每一部分均属于0-255
    int num;
    for(int i = 0;i < partSize;++i){
        num = atoi(part[i].c_str());
        numVec.push_back(num);
        if(num < 0 || num > 255){
            return false;
        }//if
    }//for
    // 代表错误IP
    if(pointCount != 3){
        return false;
    }//if
    return true;
}

int IsSameSubNetwork(char * pcIp1, char * pcIp2, char * pcSubNetworkMask){
    if(pcIp1 == NULL || pcIp2 == NULL || pcSubNetworkMask == NULL){
        return 0;
    }//if
    // 转换为string (自己习惯)
    string ip1(pcIp1);
    string ip2(pcIp2);
    string net(pcSubNetworkMask);
    vector<int> ip1Vec;
    vector<int> ip2Vec;
    vector<int> netVec;
    int result,result2;
    // ip 子网掩码 输入合法
    if(CheckIP(ip1,ip1Vec) && CheckIP(ip2,ip2Vec) && CheckIP(net,netVec)){
        for(int i = 0;i < 4;++i){
            result = ip1Vec[i] & netVec[i];
            result2 = ip2Vec[i] & netVec[i];
            if(result != result2){
                return 0;
            }//if
        }//for
    }//if
    else{
        return 0;
    }//else
    return 1;
}

你可能感兴趣的:(华为机试练习题)