找回密码
 注册
搜索
热搜: 回贴
  • 前程无忧官网首页 有什么好的平台可以
  • 最新的销售平台 互联网营销的平台有哪
  • 制作网页的基本流程 网页制作和网页设
  • 【帝国CMS】输出带序号的列表(数字排
  • 网站建设公司 三一,中联,极东泵车的
  • 织梦 建站 织梦网站模版后台怎么更改
  • 云服务官网 哪些网站有免费的简历模板
  • 如何建网站要什么条件 建网站要用什么
  • 吉林市移动公司电话 吉林省退休人员网
  • 设计类毕业论文 网站设计与实现毕业论
查看: 1828|回复: 4

请大家看看这个循环问题

[复制链接]
发表于 2009-11-2 04:37:00 | 显示全部楼层 |阅读模式 IP:江苏扬州
请大家帮忙看看下面这个代码,主要是蓝色的那段(很有可能是那里出错),红色的代码是为了测试数据而添加的。。

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模式匹配算法的,没想到居然出这种错误。。我和书上的代码比较过,没什么太大差别(算法的核心代码几乎一样)。。实在是看不出问题在哪,请大家帮帮忙。。。谢谢了。。
发表于 2009-11-2 04:37:01 | 显示全部楼层 IP:江苏扬州
大家帮帮忙啊。。。
回复

使用道具 举报

发表于 2009-11-2 04:37:05 | 显示全部楼层 IP:江苏扬州
早忘了kmp匹配是怎么样了。先查查。帮你顶一下。
回复

使用道具 举报

发表于 2009-11-2 04:37:13 | 显示全部楼层 IP:江苏扬州
算法是正确。白去看了会数据结构。。。

while((mPos < mStr.length()-1) && (sPos < sStr.length()-1)) //就是这里有些奇怪,会莫名结束循环

加上一个强制类型转换就可以,改成:
while((mPos < (int)mStr.length()-1) && (sPos < (int)sStr.length()-1))

原因如下:
length()返回的是size_type类型,查了一下msdn,size_type解释为
The unsigned integer type describes an object that can represent the length of any controlled sequence
也就是个无符号整数。问题就清楚了。
你的程序中mPos是个int,在unsigned int和int 比较时,要将int转换为unsigned int。
mPos是正数时还行,等于-1时一转换为无符号数就出错了(变成一个超级大的数了^_^)。

哈哈,好隐蔽的错误。
回复

使用道具 举报

发表于 2009-11-2 04:37:19 | 显示全部楼层 IP:江苏扬州
多谢未入流小菜鸟的帮助啊,今天早上康发现这个问题。。问题已经解决,不过又出现另一个问题:当主串中不存在子串时,返回值并不是预料的-1,而是0。。现在还没有找到原因。。请大家再帮帮忙。。再次感谢大家。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-9-30 01:36 , Processed in 0.225133 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表