Visual Studio运行C++敏感词替换代码提示string subscript out of range错误
报错原因
核心问题是bleep函数存在字符串下标越界访问:
- 外层循环中
i的遍历范围是0到text.size()-1,当i的取值满足i + word.size() > text.size()时,内层循环访问text[i + j](j最大为word.size()-1)会超出字符串的合法下标范围,属于C++标准中的未定义行为。 - Codecademy内置编辑器默认关闭了STL容器的边界安全检查,越界访问碰巧没有触发崩溃;Visual Studio默认开启了STL安全断言机制,会直接捕获到非法访问行为并抛出
string subscript out of range提示。
修复方法
调整bleep函数的外层循环终止条件,确保i的最大取值不会让后续的字符匹配访问到越界位置即可,同时增加待过滤词长度大于原句长度的兜底判断,避免无符号数运算异常:
void bleep(std::string word, std::string &text) { // 待过滤词比原句子长,不可能匹配,直接返回 if (word.size() > text.size()) { return; } // 调整循环终止条件,保证i + word.size()不超过text总长度 for (int i = 0; i <= text.size() - word.size(); i++) { int match = 0; for (int j = 0; j < word.size(); j++) { if (text[i + j] == word[j]) { match++; } } if (match == word.size()) { asterisk(word, text, i); } } }
修改后即可在Visual Studio中正常运行,逻辑和原需求完全一致。
内容的提问来源于stack exchange,提问作者George_H
相关产品推荐
相关产品推荐

