C++统计行内变位词程序无法进入for循环问题求助
问题根因分析
直接导致for循环不执行的核心原因是参数传递错误:
breakStringToWords函数的第二个参数vector<string> w是值传递,函数内部操作的是实参的副本,main函数里的vectorv不会被写入任何内容,所以sz = v.size()结果永远是0,for(int i=0; i<sz; i++)的循环条件永远不成立,自然不会进入循环。
全量问题修复方案
1. 修复split函数参数传递问题
将函数的vector参数改为引用传递,保证修改会同步到main函数的实参:
// 参数w前加&改为引用传递 void breakStringToWords(string str, vector<string>& w) { istringstream ss(str); string word; while (ss >> word) { w.push_back(word); } }
2. 修复for循环数组越界问题
当前循环逻辑中isAnagram(v[i - 1], v[i])当i=0时会访问v[-1],属于数组越界,会触发未定义行为。如果要统计相邻单词的变位词对数,循环应该从i=1开始:
for(int i=1; i<sz; i++)
3. 修复变位词判断逻辑错误
当前的isAnagram实现仅校验了y的所有字符都在x中出现过,没有校验字符出现次数、也没有判断两个字符串长度是否相等,会出现大量误判,比如"aab"和"ab"会被误判为变位词。正确的实现可以直接排序两个字符串后比较:
bool isAnagram(string x, string y) { if(x.size() != y.size()) return false; sort(x.begin(), x.end()); sort(y.begin(), y.end()); return x == y; }
4. 修复输入行单词累加问题
main函数里的vectorv定义在while循环外,每次处理新的输入行时不会清空之前的单词,会导致统计结果错误,建议把v的定义移到while循环内部,或者每次调用breakStringToWords之前执行v.clear()。
内容的提问来源于stack exchange,提问作者Ростислав Русев
相关产品推荐
相关产品推荐

