IP过滤器:实现对访问IP的限制功能

题目描述:

在后端服务中需要对恶意IP进行限制,设计一个IP过滤器,实现对IP访问限制功能,对于限制IP有三种形式:

(1) 全IP:例:222.205.58.16;  (2)前面带*:例:*.58.16(3)后面带*:例:222.205.58.*

带*的代表匹配到任意IP段均可,*可代表多个IP 段,并且*只能出现在开头或者结尾;

输入描述:

输入第一行是过滤规则的条数N和需要过滤的IP的数量M,之后N行为IP过滤的规则并合法,在之后的M行为需不需要判断被过滤。N<100,M<50。

输出描述:

0:表示IP不需要被过滤;1:则反之;

总共M条需要被判断的IP以空格作为区分;

示例:

输入:

5 4
222.205.58.16
*.58.16
222.205.58.*
*.16
224.*
222.205.58.17
222.205.59.19
223.205.59.16
224.205.59.22

输出:

1 0 1 1

代码实现:

/*  IP过滤器*/
#include<iostream>
#include <string>
using namespace std;

bool fun( string str1[],string str2,int N,int M)
{
    int m = 0;
    int n = 0 ;
    for(int j=0;j<N;j++)
    {
    //从后往前比较
        if(str1[j].find_first_of("*") == 0)   //find_first_of(args) 查找args中任何一个字符第一次出现的位置
        {
            m = str1[j].size()-1;
            n =  str2.size()-1;
	    for(;m>=0,n>=0;m--,n--) 
	    {
                if(str1[j].c_str()[m] != str2.c_str()[n])
	        {
		    break;
	        }
	    }
	}        }    
        else//从前往后比较
        {
	    m = 0;
	    n = 0;
	    for(;m<=str1[j].size()-1,n<=str2.size()-1;m++,n++) 
	    {
	        if(str1[j].c_str()[m] != str2.c_str()[n])
	        {
		    break;
	        }
	    }
	    
        }
        if(str1[j].c_str()[m]=='*')
	{
	    return true;
	}
    }
    return false;
}
int main()
{
    int N,M;
    cin>>N>>M;
    string* str1= new string[N];  //存放过滤标准
    string* str2 = new string[M];  //存放待测IP
    for(int i=0;i<N;i++)
    {
        cin>>str1[i];
    }
    for(int i=0;i<M;i++)
    {
	cin>>str2[i];
    }
    bool *arr= new bool[M]();  //保存结果
    for(int i = 0;i<M;i++)
    {
	 arr[i] = fun(str1,str2[i],N,M);
    }
    for(int i = 0;i<M;i++)
    {
	cout<<arr[i]<<" ";
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值