GO GO GO, Fire in the Hole!!!

Friday, December 30, 2005

 

C++ Primer 3rd 错误之二

在242页,6.11节(“其他string操作”)里面,有一段删除string部分内容的代码:
已知string:
string name("AnnaLiviaPlurabelle");
要生成字符串"Annabelle":
typedef string::size_type size_type;
size_type startPos = name.find('L');
size_type endPos = name.find_last_of('a');
name.erase(name.begin()+startPos, name.begin()+endPos);
书上写到,上面的代码得到的name将会是"Annaabelle",而不是"Annabelle",因为erase方法参数中的第二个iterator指向的字符不属于要被删除的范围。到此为之,一切正确。但是接下来就让人很困惑了:

“我们给他传递endPos来删除第二个重复的'a':
name.erase(endPos);

姑且不说erase的单参数形式要求的是iterator(这一点书上明确写了,虽然endPos可以转为string::iterator,不会导致编译不过,但是鉴于书中上面的代码都用的是name.begin()+endPos,我估计这是一个笔误),最严重的问题在于,如果这行代码是和上面的几行代码连用的话,是肯定会出问题的:因为第一个erase的调用已经移除了name里面的部分字符,此时再按照之前查找'a'的位置去erase这个多余的'a',如果字符串此时长度小于endPos,那么就会导致invalide range的exeption,或者字符串幸运的足够长,那么将会误删掉一个不该删掉的字符而把'a'继续留在原地。

Comments: Post a Comment





<< Home

Archives

October 2005   December 2005   January 2006   June 2009  

This page is powered by Blogger. Isn't yours?

Subscribe to Posts [Atom]