这道题目要判断输入的子网掩码和ip地址是否合法。
#include <stdarg.h>
#include <stdio.h>
#include <iostream>
#include <vector>
#include <string.h>
#include <algorithm>
#include <stdlib.h>
#include <memory>
#include <string.h>
#include <set>
#include <map>
#include <sstream>
#include <string>
using namespace std;
int checkNetSegment(string mask, string ip1, string ip2)
{
if(mask.size() == 0||ip1.size() == 0||ip2.size() == 0)
{
return 1;
}
/*在这里实现功能*/
int i = 0, j = 0;
char szStrMask[100] = {0};
char szStrip1[100] = {0};
char szStrip2[100] = {0};
int aMask[4] = {0};
int aip1[4] = {0};
int aip2[4] = {0};
char* taken = NULL;
/* ip1与子网掩码求& */
memset(szStrMask,0,100);
memset(szStrip1,0,100);
memset(szStrip2,0,100);
strcpy(szStrMask,mask.c_str());
strcpy(szStrip1,ip1.c_str());
strcpy(szStrip2,ip2.c_str());
/* 把子网掩码的四个int型数据取出来 */
taken = strtok(szStrMask,".");
i = 0;
while(taken != NULL)
{
aMask[i] = atoi(taken);
if(i == 0)
{
if(aMask[i] != 255)
{
return 1;
}
}
else
{
if(aMask[i] > 255 || aMask[i] < 0)
{
return 1;
}
}
i++;
taken = strtok(NULL,".");
}
/* 判断是否合法 */
if(i != 4)
{
return 1;
}
/* 把ip1的四个int型数据取出来 */
taken = strtok(szStrip1,".");
i = 0;
while(taken != NULL)
{
aip1[i] = atoi(taken);
if(aip1[i] > 255 || aip1[i] < 0)
{
return 1;
}
i++;
taken = strtok(NULL,".");
}
/* 判断是否合法 */
if(i != 4)
{
return 1;
}
/* 把ip2的四个int型数据取出来 */
taken = strtok(szStrip2,".");
i = 0;
while(taken != NULL)
{
aip2[i] = atoi(taken);
if(aip2[i] > 255 || aip2[i] < 0)
{
return 1;
}
i++;
taken = strtok(NULL,".");
}
/* 判断是否合法 */
if(i != 4)
{
return 1;
}
/* 将mask与ip1运算 */
for(i = 0; i < 4; i++)
{
aip1[i] = (aMask[i] & aip1[i]);
}
/* 将mask与ip2运算 */
for(i = 0; i < 4; i++)
{
aip2[i] = (aMask[i] & aip2[i]);
}
/* 判断是否在同一个网段 */
for(i = 0; i < 4; i++)
{
if(aip1[i] != aip2[i])
{
return 2;
}
}
return 0;
}
int main()
{
string mask, ip1, ip2;
cin >> mask >> ip1 >> ip2;
cout << checkNetSegment(mask,ip1,ip2) << endl;;
return 0;
}
博客探讨了如何在华为在线判题系统(OJ)中确定两个IP地址是否属于同一子网,主要涉及IP地址和子网掩码的合法性验证。

7887

被折叠的 条评论
为什么被折叠?



