高分请教问题,有兴趣的来看看

djgfhd 2004-07-11 10:06:49
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

请各位高手帮帮忙,谢谢
...全文
96 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
oo 2004-07-11
  • 打赏
  • 举报
回复
if (shift == NULL)
// FatalPrintError("malloc");

c = ptrn[plen - 1];

不能只注释掉一行的,应该把if (shift == NULL)也注释掉,你现在的变成:
if (shift == NULL)
c = ptrn[plen - 1]; //这一行不会执行到了。c变成一个随机值
chenang 2004-07-11
  • 打赏
  • 举报
回复
upup
cnxiaohai 2004-07-11
  • 打赏
  • 举报
回复
呵呵

我想回复了

看到原来OO看出来得问题和我一样

那我就不说废话了~~~~~~~~~~~~~~~~~~~~~~

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧