| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 469 人关注过本帖
标题:请大家看看这个循环问题
取消只看楼主 加入收藏
圆圆的鸟蛋
Rank: 1
等 级:新手上路
帖 子:216
专家分:0
注 册:2007-4-22
收藏
 问题点数:0 回复次数:2 
请大家看看这个循环问题

请大家帮忙看看下面这个代码,主要是蓝色的那段(很有可能是那里出错),红色的代码是为了测试数据而添加的。。

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编辑过]

2007-08-18 22:01
圆圆的鸟蛋
Rank: 1
等 级:新手上路
帖 子:216
专家分:0
注 册:2007-4-22
收藏
得分:0 
大家帮帮忙啊。。。

鸟蛋开始孵化。。。我等待那一天Forever。。
2007-08-19 09:18
圆圆的鸟蛋
Rank: 1
等 级:新手上路
帖 子:216
专家分:0
注 册:2007-4-22
收藏
得分:0 
多谢未入流小菜鸟的帮助啊,今天早上康发现这个问题。。问题已经解决,不过又出现另一个问题:当主串中不存在子串时,返回值并不是预料的-1,而是0。。现在还没有找到原因。。请大家再帮帮忙。。再次感谢大家。。

鸟蛋开始孵化。。。我等待那一天Forever。。
2007-08-20 13:23
快速回复:请大家看看这个循环问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017762 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved