识别有效的IP地址和掩码并进行分类统计/华为机试

版权声明:本文为博主原创文章,转载请注明出处 https://blog.csdn.net/thecentry。 https://blog.csdn.net/thecentry/article/details/82314032

题目描述

请解析IP地址和对应的掩码,进行分类识别。要求按照A/B/C/D/E类地址归类,不合法的地址和掩码单独归类。

所有的IP地址划分为 A,B,C,D,E五类

A类地址1.0.0.0~126.255.255.255;

B类地址128.0.0.0~191.255.255.255;

C类地址192.0.0.0~223.255.255.255;

D类地址224.0.0.0~239.255.255.255;

E类地址240.0.0.0~255.255.255.255

私网IP范围是:

10.0.0.0~10.255.255.255

172.16.0.0~172.31.255.255

192.168.0.0~192.168.255.255

子网掩码为前面是连续的1,然后全是0。(例如:255.255.255.32就是一个非法的掩码)

本题暂时默认以0开头的IP地址是合法的,比如0.1.1.2,是合法地址

输入描述:

多行字符串。每行一个IP地址和掩码,用~隔开。

输出描述:

统计A、B、C、D、E、错误IP地址或错误掩码、私有IP的个数,之间以空格隔开。

示例1

输入

10.70.44.68~255.254.255.0
1.0.0.1~255.0.0.0
192.168.0.2~255.255.255.0
19..0.~255.255.255.0

输出

1 0 1 0 0 2 1

代码1:

#include<iostream>
#include<string>
#include<vector>
using namespace std;

int MaskIsValid(string test_mask)
{
	if (test_mask.empty())
	{
		return 0;
	}
	size_t start_position = 0, end_position = 0,front_value=0,inum=0;
	while ((end_position = test_mask.find_first_of('.', start_position)) != string::npos)
	{
		if (start_position == end_position)
		{
			return 0;
		}
		inum++;
		string temp = test_mask.substr(start_position, end_position);
		start_position = end_position + 1;
		int itemp = atoi(temp.c_str());
		if (inum == 1)
		{
			front_value = itemp;
			if (itemp != 128 && itemp != 192 && itemp != 224 && itemp != 240
				&& itemp != 248 && itemp != 252 && itemp != 254 && itemp != 255)
			{
				return 0;
			}
		}
		else if (front_value != 255 && itemp != 0)
		{
			return 0;
		}
		else if (itemp != 128 && itemp != 192 && itemp != 224 && itemp != 240
			&& itemp != 248 && itemp != 252 && itemp != 254 && itemp != 255 && itemp != 0)
		{
			return 0;
		}
		front_value = itemp;
	}
	if (inum != 3)
	{
		return 0;
	}
	else
	{
		string temp2 = test_mask.substr(start_position, test_mask.length() - start_position);
		int itemp2 = atoi(temp2.c_str());
		if (front_value != 255 && itemp2 != 0)
		{
			return 0;
		}
		else if(itemp2 != 128 && itemp2 != 192 && itemp2 != 224 && itemp2 != 240
			&& itemp2 != 248 && itemp2 != 252 && itemp2 != 254 && itemp2 != 0)
		{
		     return 0;
		}
		else
		{
			return 1;
		}
	}
}

int IpIsValid(string ip_test,int& i_ips)
{
	if (ip_test.empty())
	{
		return 0;//invalid + 1
	}
	i_ips = 0;
	size_t start_position = 0, end_position = 0, inum = 0, first_value = 0, second_value = 0;
	while ((end_position=ip_test.find_first_of('.',start_position))!=string::npos)
	{
		if (start_position == end_position)
		{
			return 0;
		}
		inum++;
		string temp = ip_test.substr(start_position, end_position);
		int itemp = atoi(temp.c_str());
		start_position = end_position + 1;
		if (inum == 1)
		{
			first_value = itemp;
		}
		else if (inum == 2)
		{
			second_value = itemp;
		}
		else if (inum == 3 && start_position == ip_test.length())
		{
			return 0;
		}
	}
	if (inum != 3)
	{
		return 0;
	}
	else if (first_value == 0)
	{
		return 7;
	}
	else if (first_value < 127)
	{
		if (first_value == 10)
		{
			i_ips = 1;
		}
		return 1;
	}
	else if (first_value < 192)
	{
		if (first_value == 127)
		{
			return 6;
		}
		else if (first_value == 172 && second_value > 15 && second_value < 32)
		{
			i_ips = 1;
		}
		return 2;
	}
	else if (first_value < 224)
	{
		if (first_value == 192 && second_value==168)
		{
			i_ips = 1;
		}
		return 3;
	}
	else if (first_value < 240)
	{
		return 4;
	}
	else if (first_value <= 255)
	{
		return 5;
	}
	else
	{
		return 0;
	}
}
int main()
{
	int ip_a = 0, ip_b = 0, ip_c = 0, ip_d = 0, ip_e = 0, ip_s = 0, ip_w = 0;
	string inStr;
	while (getline(cin,inStr))
	{
		if (inStr.empty())
		{
			break;
		}
		size_t dPosition = 0;
		size_t sLength = inStr.length();
		if (sLength == 0)
		{
			break;
		}
		if ((dPosition = inStr.find('~')) != string::npos)
		{
			int t_falg = 0;
			size_t iPosition = dPosition + 1;
			string ipStr = inStr.substr(0, dPosition);
			string maskStr = inStr.substr(iPosition, sLength - iPosition);
			if (MaskIsValid(maskStr) == 0)
			{
				ip_w += 1;
				continue;
			}
			else
			{
				int itemp = 0;
				switch (IpIsValid(ipStr, itemp))
				{
				case 0:
					ip_w += 1;
					break;
				case 1:
					ip_a += 1;
					ip_s += itemp;
					break;
				case 2:
					ip_b += 1;
					ip_s += itemp;
					break;
				case 3:
					ip_c += 1;
					ip_s += itemp;
					break;
				case 4:
					ip_d += 1;
					break;
				case 5:
					ip_e += 1;
					break;
				default:
					break;
				}
			}
		}
	}
	cout << ip_a << " " << ip_b << " " << ip_c << " " << ip_d << " " << ip_e << " " << ip_w << " " << ip_s << endl;
	return 0;
}

代码2:

#include <stdlib.h>
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
using namespace std;

vector<string> split(string str, char del) {
	stringstream ss(str);
	string tok;
	vector<string> ret;
	while (getline(ss, tok, del)) {
		ret.push_back(tok);
	}
	return ret;
}
bool IPisvalid(vector<string> svec) {
	if (svec.size() != 4) {
		return false;
	}
	return true;
}
bool Maskisvalid(vector<string> svec) {
	bool zero = false;
	if (svec.size() != 4) {
		return false;
	}
	for (int i = 0; i < 4; i++) {
		if (zero == false) {
			if (atoi(svec[i].c_str()) != 255) {
				if (atoi(svec[i].c_str()) != 0 &&
					atoi(svec[i].c_str()) != 128 &&
					atoi(svec[i].c_str()) != 192 &&
					atoi(svec[i].c_str()) != 224 &&
					atoi(svec[i].c_str()) != 240 &&
					atoi(svec[i].c_str()) != 248 &&
					atoi(svec[i].c_str()) != 252 &&
					atoi(svec[i].c_str()) != 254) {
					return false;
				}
				else {
					zero = true;
				}
			}
		}
		else {
			if (atoi(svec[i].c_str()) != 0) {
				return false;
			}
		}
	}
	if (atoi(svec[3].c_str()) == 255) {
		return false;
	}
	return true;
}

int main() {
	vector<int> ret(7, 0);
	string str;
	vector<string> svec;
	vector<string> ip;
	vector<string> mask;
	while (getline(cin,str)) {
		svec = split(str, '~');
		ip = split(svec[0], '.');
		mask = split(svec[1], '.');
		if (Maskisvalid(mask) && IPisvalid(ip)) {
			if (atoi(ip[0].c_str()) >= 1 && atoi(ip[0].c_str()) <= 126) {
				++ret[0];
				if (atoi(ip[0].c_str()) == 10)
					++ret[6];
			}
			else if (atoi(ip[0].c_str()) >= 128 && atoi(ip[0].c_str()) <= 191) {
				++ret[1];
				if (atoi(ip[0].c_str()) == 172) {
					if (atoi(ip[1].c_str()) >= 16 && atoi(ip[1].c_str()) <= 31)
						++ret[6];
				}
			}
			else if (atoi(ip[0].c_str()) >= 192 && atoi(ip[0].c_str()) <= 223) {
				++ret[2];
				if (atoi(ip[0].c_str()) == 168)
					++ret[6];
			}
			else if (atoi(ip[0].c_str()) >= 224 && atoi(ip[0].c_str()) <= 239) {
				++ret[3];
			}
			else if (atoi(ip[0].c_str()) >= 240 && atoi(ip[0].c_str()) <= 255) {
				++ret[4];
			}
		}
		else {
			ret[5]++;
		}
	}
	cout << ret[0] << " " << ret[1] << " " << ret[2] << " " << ret[3] << " " << ret[4] << " " << ret[5] << " " << ret[6] << endl;
	system("pause");
	return 0;
}

代码一测试时间4ms,代码二(不是本人写的,调bug时,对比那个差错用的)测试时间8ms。

本人在写这段代码的时候遇见一个坑,那就是127.段的ip我认为是错的,然而系统设定的不是错误,哎,这一个理解上的不同真的是费了不少时间。

猜你喜欢

转载自blog.csdn.net/thecentry/article/details/82314032
今日推荐