题目描述
请解析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。