识别有效的IP地址和掩码并进行分类统计

描述

请解析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


知识点 字符串,循环,查找,搜索,排序,函数,指针,枚举,位运算,结构体,联合体,文件操作,递归
运行时间限制 0M
内存限制 0
输入

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

 

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


输出

统计A、B、C、D、E、错误IP地址或错误掩码、私有IP的个数,之间以空格隔开,根据上面的IP,可以得到:

 

1.0.0.1~255.0.0.0 ----A类

 

192.168.0.2~255.255.255.0  ----C类,私有

 

10.70.44.68~255.254.255.0----错误的掩码

 

19..0.~255.255.255.0-----错误的IP

 

可以得到统计数据如下:

 

1 0 1 0 0 2 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
思路:

按行读取IP地址及掩码,然后逐行按‘.’(点)把字符串变成数字放进数组,通过判断IP地址及掩码的数值个数及范围判断其有效性;(笨方法,仅是一种思路,用正则表达式会简单很多)

代码如下:

#include <iostream>
#include <vector>
#include <stack>
using namespace std;
bool isIP(vector<char> &a,vector<int> &b){
	 int i = 0,temp = 0,pre = 0;
	 while(a[i] !='~'){
		 if(a[i] == '.'){
		      int now = i-1,ol = 1;
			  if(a[pre] == '.'){
			       i++;
				   continue;
			  }
			  while(now >= pre){
			      temp += (a[now] - '0')*ol;
				  now--;
				  ol *= 10; 
			  }
			  b.push_back(temp);
			  temp = 0;
			  pre = i+1;
			  i++;
		 }else
			 i++;
	 }
     int now = i-1,ol = 1;
     while(now >= pre){
		 temp += (a[now]-'0')*ol;
		 now--;
		 ol *= 10; 
	 }
	 b.push_back(temp);
     int len = b.size();
	 //cout << len;
	 if(len == 4){
		 for(int j = 0;j < 4;j++){
			 //cout << b[j];
		      if(b[j] >= 0 && b[j] <= 255)
				  continue;
			  else
				  return false;
		 } 
		 return true;
	 }else
		 return false;
}
bool isMesk(vector<char> &a){
	 vector<int> b;
	 b.clear();
     int i = 0,temp = 0,pre;
	 while(a[i] != '~')
		 i++;
	 pre = i+1;
	 while(a[i] !='\0'){
		 if(a[i] == '.'){
		      int now = i-1,ol = 1;
			  while(now >= pre){
			      temp += (a[now] - '0')*ol;
				  now--;
				  ol *= 10; 
			  }
			  b.push_back(temp);
			  temp = 0;
			  pre = i+1;
			  i++;
		 }else
			 i++;
	 }
	 int now = i-1,ol = 1;
	 temp = 0;
	 while(now >= pre){
	     temp += (a[now]-'0')*ol;
	     now--;
	     ol *= 10; 
	 }
	 b.push_back(temp);
	 int len = b.size();
	 if(len == 4){
		 for(int m = 0;m < 3;m++){
			// cout << b[m] << " ";
		     if(b[m] == b[m+1] && (b[m] == 255 || b[m] == 0))
				 continue;
			 else if(b[m] > b[m+1])
				 continue;
			 else
				 return false;
			 cout << b[m] << " ";
		 }
		 for(int j = 0;j < 4;j++){
		      if(b[j] == 255 || b[j] == 254 || b[j] == 252 || b[j] == 248 || 
				  b[j] == 240 || b[j] == 224 || b[j] == 192 || b[j] == 128 || b[j] == 0)
				  continue;
			  else 
				  return false;
		 } 
		 return true;
	 }else
		 return false;
} 
bool isnumber(char c){
     if(c >= '0' && c <= '9')
		 return true;
	 else
		 return false;
}
int main()
{
	int a_back = 0,b_back = 0,c_back = 0,d_back = 0,e_back = 0,si_back = 0,err_back = 0; 
	char a[20][70];
	int i = 0;
	while(cin.getline(a[i],70,'\n') && a[i][0] != '\0'){
	    i++;
	}
	for(int j = 0;j < i;j++){
		vector<char> v;
		vector<int> b;
	    int len = strlen(a[j]);
		for(int m = 0;m < len;m++){
		    v.push_back(a[j][m]);
		}
		v.push_back('\0');
		bool isip = isIP(v,b),ismask = isMesk(v);
        if(isip && ismask){
			if(b[0] >= 1 && b[0] < 128)
				a_back++;
			if(b[0] >= 128 && b[0] < 192)
				b_back++;
			if(b[0] >= 192 && b[0] < 224)
				c_back++;
			if(b[0] >= 224 && b[0] < 240)
				d_back++;
			if(b[0] >= 240 && b[0] < 256)
				e_back++;
			if((b[0] == 10) || (b[0] == 127 && b[1] >= 16 && b[1] <= 31) || (b[0] ==192 && b[1] == 168))
                si_back++;
		}
		else
			err_back++;
	}
	cout << a_back << " " << b_back << " " << c_back << " "
		<< d_back << " " << e_back << " " << err_back << " "
		<< si_back <<endl;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值