问题代码
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
void prin_vec (ostream& Out,vector<string>& word_list)
{
vector<string>::const_iterator i,j;
i=word_list.begin();
sort(word_list.begin(),word_list.end());
while(i!=word_list.end())
{
j=i;
while(*j==*i &&j!=word_list.end() )
j++;
Out<<(*i )<<" occur "<<j-i<<" times"<<endl;
i=j;
}
}
int main()
{
string s;
vector<string> word_list;
while(cin>>s)
word_list.push_back(s);
prin_vec(cout,word_list);
}
注意这个片段
while(*j==*i &&j!=word_list.end() )
j++;
Out<<(*i )<<" occur "<<j-i<<" times"<<endl;
i=j;
}
如果j++之后j变为越界值,那么对J进行解引用会导致运行报错。
而因为是发生在判断语句中的,所以可能比较难以察觉。
错误代码
*j==*i &&j!=word_list.end()
正确代码
j!=word_list.end() && *j==*i
“`
也就是变成先检测j是否是越界值,是就不用解引用,否则解引用。
错误警示
当使用迭代器时,先弄一个单独的判断是否越界,再在之后的下个if中判断其他条件。
其他警示
调试过程中箭头指向的代码段不是正在执行的,而是下一条即将执行的,因此如果指向某条之后再选择下一条就马上报错,则问题出现再某条,而不是下一条。