GO GO GO, Fire in the Hole!!!

Friday, December 30, 2005

 

发现C++ Primer 3rd edition里面的一个错误

在234页的字符分隔函数里面,得到一行文字的最后一个word是这样处理的:
short word_pos = 0;
string textline = (*text_file)[line_pos];
string::size_type pos = 0;
string::size_type prev_pos = 0;
while( (pos = textline.find_first_of(' ', pos)) != string::npos )
{
words->push_back(textline.substr(prev_pos, pos-prev_pos));
locations->push_back(make_pair(line_pos, word_pos));
++word_pos;
prev_pos = ++pos;
}
words->push_back(textline.substr(prev_pos, pos-prev_pos));

注意最后这句,pos在此时实际上已经等于 string::npos 了,所以 pos-prev_pos 并不是真实的最后一个字符的长度。那么为什么这段代码执行不会有问题呢?呵呵,这是因为,std::string的substr方法,在截取子字符串时,如果已经到了末尾,就算截取到的子字符串还没有第二个参数那么长,也会停止。换句话说,在这里是想要substr最后一个字符,那么只要起始点正确,给substr的第二个参数足够大,那么就肯定能够得到最后一个字符。现在我们再来看看string::npos的定义,在我的VC7.1自带的stl里面的定义是4294967295这个数字,也就是十六进制的oxFFFFFFFF(32位机器上的unsigned int所能表示的最大值),所以这第二个参数肯定是足够大到获取最后一个字符的。
虽然结果是正确的,但是感觉还是有点不爽,稍微改一下,变成这个样子:
words->push_back(textline.substr(prev_pos, textline.length()-prev_pos));
ok,feel better~~

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]