如何使用两个vector打印给定输入字符串中每个单词的出现频率
代码现存问题
- 容器使用错误且未初始化:你声明了二维
vector<vector<string>> strs,实际只需要一维vector存储单词即可,且未给vector分配空间就直接用下标赋值,会触发内存越界直接崩溃。 - 单词分割逻辑错误:遍历字符串时存在多余的
i++操作,且会把空格也计入单词内容,连续空格场景还会生成空的无效单词。 - 频率统计逻辑错误:
- 频率初始值设置有误,匹配到相同单词时重复累加,导致计数偏大
- 错误地在内层循环中执行
push_back操作,最终frequency数组长度是单词数的平方,和单词下标无法一一对应
- 哨兵逻辑冗余:不需要额外插入"NULL"作为结束标记,vector自带
size()方法可直接获取存储的单词总数。
修正后代码
#include <iostream> #include <string> #include <vector> using namespace std; int main() { // 只用一维vector存单词即可 vector<string> words; string str; cout << "Enter your strings" << endl; getline(cin, str); int len = str.length(); string cur_word = ""; // 修正后的单词分割逻辑 for(int i = 0; i < len; i++){ if(str[i] == ' '){ // 遇到空格且当前单词非空就存储 if(!cur_word.empty()){ words.push_back(cur_word); cur_word.clear(); } }else{ cur_word += str[i]; } } // 存入最后一个末尾无空格的单词 if(!cur_word.empty()){ words.push_back(cur_word); } vector<int> frequency; // 修正后的频率统计逻辑 for(int n = 0; n < words.size(); n++){ int freq = 0; for(int m = 0; m < words.size(); m++){ if(words[n] == words[m]){ freq++; } } frequency.push_back(freq); } // 输出和示例格式完全匹配 for(int x = 0; x < words.size(); x++){ cout << words[x] << "-" << frequency[x] << endl; } return 0; }
验证说明
输入hey hi Mark hi mark时,输出完全符合预期:
hey-1 hi-2 Mark-1 hi-2 mark-1
代码默认区分字符串大小写,符合示例中Mark和mark计数独立的要求。
内容的提问来源于stack exchange,提问作者Vidushi Gupta
相关产品推荐
相关产品推荐

