请大家帮忙看看下面这个代码,主要是蓝色的那段(很有可能是那里出错),红色的代码是为了测试数据而添加的。。
Kmp::Kmp(const string &str)
{
//动态申请数组,初始化pNext
int len = str.length() ;
pNext = new int[len] ;
//内存分配失败的错误处理
if(pNext == NULL)
{
cout << "内存分配出错!" << endl ;
exit(0) ;
}
//给pNext指向的数组赋值
int sPos = 0 ;
int tPos = -1 ;
*(pNext+0) = -1 ;
while(sPos < (str.length()-1))
{
if((-1 == tPos) || (str[sPos] == str[tPos]))
{
sPos++ ;
tPos++ ;
*(pNext+sPos) = tPos ;
}
else
{
tPos = *(pNext+tPos) ;
}
}
}
//模式串在主串中的起始位置。若不存在则返回-1
int Kmp::SubStrPos(const string &mStr, const string &sStr)
{
int mPos = 0 ; //主串指针,初始化为0
int sPos = 0 ; //子串指针,初始化为0
int StartPos = -1 ; //模式串在主串中的起始位置,初始化为-1
int i = 0 ;
while((mPos < mStr.length()-1) && (sPos < sStr.length()-1))
{
if((-1 == sPos) || (mStr[mPos] == sStr[sPos]))
{
mPos++ ;
sPos++ ;
}
else
{
sPos = *(pNext+sPos) ;
}
i++ ;
cout << i << endl ; //结果为1,说明只循环了一次
cout << mStr.length()-1 << endl ; //结果为6。
cout << mPos << endl ; //结果是0。
bool m = (mPos < mStr.length()-1) ;
cout << m << endl ; //结果是1,说明while语句的第一个条件成立
cout << sStr.length()-1 << endl ; //结果是3。
cout << sPos << endl ; //结果是-1。
bool s = (sPos < sStr.length()-1) ;
cout << s << endl ; //结果是0,说明while语句的第二个条件不成立,也就是-1<4不成立。这是为什么呢?
//似乎也是这里导致循环只被执行1次,从而使整个执行结果出错。。
}
if(sPos >= sStr.length()-1)
{
StartPos = mPos - sStr.length() + 1 ;
}
return StartPos ;
}
Kmp::~Kmp()
{
delete [] pNext ;
}
在main函数中调用SubStr函数时,传入的参数分别是"abababa" ,"baba"(定义对象时传入的也是它)。
原本是想实现KMP模式匹配算法的,没想到居然出这种错误。。我和书上的代码比较过,没什么太大差别(算法的核心代码几乎一样)。。实在是看不出问题在哪,请大家帮帮忙。。。谢谢了。。
[此贴子已经被作者于2007-8-18 22:11:50编辑过]