高分请教问题,有兴趣的来看看
int *make_shift(char *ptrn, int plen)
{
int *shift = (int *) malloc(plen * sizeof(int));
int *sptr = shift + plen - 1;
char *pptr = ptrn + plen - 1;
char c;
if (shift == NULL)
// FatalPrintError("malloc");
c = ptrn[plen - 1];
*sptr = 1;
while(sptr-- != shift)
{
char *p1 = ptrn + plen - 2, *p2, *p3;
do
{
while(p1 >= ptrn && *p1-- != c);
p2 = ptrn + plen - 2;
p3 = p1;
while(p3 >= ptrn && *p3-- == *p2-- && p2 >= pptr);
}
while(p3 >= ptrn && p2 >= pptr);
*sptr = shift + plen - sptr + p2 - p3;
pptr--;
}
return shift;
}
int main()
{
char *p="qcabdabdab";
int plen=10;
int *s=make_shift(p,plen);
return 1;
}
make_shift是SNORT入侵检测系统中所用BM算法的后缀移动表,把它单独拿出来放在如上的主程序里面运行,每次运行后结果有点不对,调试运行后每次到
while(p1 >= ptrn && *p1-- != c);
这句完P1总是指向一个空的值,请问题这是怎么回事,是不是这个算法是错误的
而且结果总是这样的
s[0]=16 s[1]=15 s[2]=14 s[3]=13 s[4]=12 s[5]=11
s[6]=10 s[7]=9 s[8]=8 s[9]=1
请各位高手帮帮忙,谢谢