題目描述:
在後端服務中需要對惡意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;
}