bm是一种单模搜索算法
下面给出一般性的代码,可运行
#include "stdio.h"
#include "string.h"
/*
基于二进制的bm搜索算法 区分大小写 可以 混杂二进制不可见字符
*/
typedef int (*lookback)(int pos,int times); //bm中搜索回调函数 第一个参数为匹配位置 ,第二个参数为匹配次数
int InitBadWord(int bw[],const unsigned char substr[],const int len) //坏字表的初始化 区分大小写
{
memset(bw,0,sizeof(int)*256);
int index=0;
for(index=0;index<256;index++)
{
bw[index]=len;
}
for(index=len-2;index>=0;index--)
{
bw[substr[index]]=len-1-index;
}
return 0;
}
int bmseek(const unsigned char *tarstr,const int tarlen,const unsigned char *sub,const int len,const int bw[],const lookback fun) // bm查找 跳字符查找
{
int times=0;
const unsigned char *strp=tarstr;
char endch=0;
int pos=0;
times++;
do
{
times++;
endch=tarstr[pos+len-1];
pos+=bw[endch];
strp=tarstr+pos;
if(pos+len>tarlen)
break;
if(memcmp(strp,sub,len)==0)
{
if(fun(pos,times)==0)
{
continue;
}
}
}while(1);
return 0;
}
int mylookback(const int pos, const int times)
{
printf("at %d times find pos %d\n",times,pos);
return 0;
}
int main()
{
int badword[256]; //申明 坏字表空间
char *substr="hihjkl"; //匹配字串
char *tarstr="abcdefghihjklmnopqrshihjhihjklkltuhihjklvwxyz"; //查找串
InitBadWord(badword,(unsigned char *)substr,strlen(substr)); //初始化坏字表
printf("ret=%d\n",
bmseek((unsigned char *)tarstr,strlen(tarstr),(unsigned char *)substr,strlen(substr),badword,mylookback)); //查找串
getchar();
return 0;
}