C++ 遍历字符串分割单词到vector的迭代逻辑优化方法
问题根因
last变量未初始化,直接执行last++属于未定义行为,运行结果不可控- 字符串最后一个单词末尾没有空格,遍历结束后不会触发else分支的存入逻辑,导致最后一个单词丢失
- 原代码没有处理连续空格、首尾空格的边界情况,遇到这类输入会存入空字符串
优化后代码
#include <vector> #include <string> std::vector<std::string> wordChopper(const std::string& s) // 改为const引用更合理,不需要修改原字符串 { std::vector<std::string> words; if (s.empty()) return words; // 空输入直接返回 int first = 0; int word_len = 0; // 替换last,明确表示是当前单词长度,初始化避免未定义行为 for (unsigned int i = 0; i < s.size(); i++) { if (s[i] != ' ') { word_len++; } else { if (word_len > 0) // 过滤连续空格的空字符串 { words.push_back(s.substr(first, word_len)); word_len = 0; } first = i + 1; } } // 循环结束后处理末尾的最后一个单词 if (word_len > 0) { words.push_back(s.substr(first, word_len)); } return words; }
优化说明
- 参数改为
const std::string&,避免不必要的拷贝同时保证不会修改原字符串 - 初始化单词长度变量为0,消除未定义行为
- 遍历结束后额外判断一次当前单词长度,大于0就存入vector,解决最后一个单词丢失的问题
- 增加长度判断逻辑,遇到连续空格、首尾空格时不会存入无效的空字符串
内容的提问来源于stack exchange,提问作者Eliana Lopez
相关产品推荐
相关产品推荐

