我发现了《C++ Primer题解》的一个小程序的bug

iamwh 2004-08-22 10:29:33
第五章 练习5.19(99页)
写出一个count()函数

里面有 while(i=find(value,i)){
i=i->next();
cnt++;
}

这是利用链表的find()函数统计一个值在链表中出现的次数,find()的第二个参数是一个 list_item*指针,默认是0,如果是0,则从链表的起始位置开始查找,否则从i开始查找

但是如果要查找的链表项正好是链表的最后一项,最后一项的->next()也是0,这样就会又从第一项开始查找,这样程序就会陷入死循环

解决方法是这样:
while(i=find(value,i)){
i=i->next();
cnt++;
if(!i)break;
}

我说的对不对呀? :)
...全文
230 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
iamwh 2004-08-24
  • 打赏
  • 举报
回复
加入i为一个空指针
改为
假如i为一个空指针,
iamwh 2004-08-24
  • 打赏
  • 举报
回复
Wolf0403(完美废人)(Linux,我爱你爱得好辛苦)
你还没明白我的意思哦

我并不是说find(value,i)返回0,实际上就是因为find(value,i)永远也不可能返回0,程序才进入了死循环。

另外这个find()也是不std中的find,而是《C++ Primer题解》的作者写的一个find()

i的数据类型是一个list_item * 是链表中的一项,假如一个链表是这样:

5->...->6->1->(0) 其中(0)代表值为1的项的_next指向一个空指针,链表结束

现在我要查找1在链表中出现的个数,就是find(1,_at_front),其中_at_front代表链表的起始位置,这样在循环了若干次后找到了最后一个1,然后find会从1的后面的项再次开始循环,而1后面的项是空指针,加入i为一个空指针,find()函数默认是从链表头开始循环,这样等于又执行了find(1,_at_front),然后循环到最后一个1时,又碰到空指针,这样又一次从链表头开始循环,这样就陷入死循环了

如果你手上有《C++ Primer》和《C++ Primer 题解》,拿出来看一下就知道了
  • 打赏
  • 举报
回复
i是被查找的目标链表
  • 打赏
  • 举报
回复
我测试了是正确的,但在调用之前对i必须初始化。对一个没目标的链表进行查找是没有意义的。不过你的find好像不是std中的find。
Wolf0403 2004-08-24
  • 打赏
  • 举报
回复
那么你告诉我

while (*strDst++ = *strSrc++)
;

是不是也有 bug?需要改成

while (*strDst++ = *strSrc++)
if (*strDst = '\0')
break;

这样?
iamwh 2004-08-23
  • 打赏
  • 举报
回复
我说的绝对是正确的,这个程序就是有bug
我已经测试过了,不加if(!i)break;程序就是死循环

并不是find(value,i)返回0,而是i为0,如果i为0,则find(value,i)会再次从表头开始查找,是你们没搞清楚
Inkick 2004-08-23
  • 打赏
  • 举报
回复
嗯,我同意xteaj(),操作符的返回值问题
wasoxi 2004-08-23
  • 打赏
  • 举报
回复
那样是对的
不会出现楼主说的那种情况的!!
demo001 2004-08-23
  • 打赏
  • 举报
回复
'='操作符是有返回值的

while(...=...)正体现C的高效啊
riynivke 2004-08-23
  • 打赏
  • 举报
回复
我同意楼上的看法,如果返回的是NULL,则退出循环,代码没有什么不对
LabelLee 2004-08-22
  • 打赏
  • 举报
回复
while(i=find(value,i))
while (i == find (value, i))??
  • 打赏
  • 举报
回复
while(i=find(value,i))
注意,不是用的逻辑操作==,而是用的赋值操作=
赋值操作符返回操作的结果,如果a=3,则该名返回3。
a=0;
if(a=3)结果为真。
相反
a=0;
if(a=0)同样返回假。
donrong 2004-08-22
  • 打赏
  • 举报
回复
各位,能否告知哪里有《C++ Primer 题解》下载,最好是英文版?
Jinhao 2004-08-22
  • 打赏
  • 举报
回复
不,好象是正确的,每看find的代码
如果都找不到find就返回NULL,只是多搜了一次
wwwooowww 2004-08-22
  • 打赏
  • 举报
回复
ok, I think your are right.
I agree with your idea.

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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