在一个带有两个参数字符串
s
和子字符串 part
的函数中。我想删除所有出现的子字符串。它可以找到,但是当 s
= eemckxmckx 和 part
= emckx 时,它会抛出错误。
string removeOccurrences(string &s, const string &part) {
int lenPart = part.length();
int slen = s.length();
int i = 0;
while (i <= (slen - lenPart)) {
如果循环当前迭代中的子字符串等于我要删除的子字符串(
part
)。从字符串中删除该部分。
if (s.substr(i, lenPart) == 部分) {
s.erase(i, lenPart);
这是针对要删除的子串连续出现两次的情况。
i-lenPart
确保 i
在下一次迭代和 max 函数中保持不变,以便 i
永远不会变成 <=-1
。
i = max(0, i - lenPart);
} else {
i++;
}
}
return s;
}
s.size()
会在循环中减少,直到达到0
,然后你的算法最终会尝试
if (s.substr(i /* 1 */, lenPart /* 5 */) == part)
1
出界,因此抛出。
要修复循环,请不要执行
i = max(0, i - lenPart);
。相反,让 i
留在同一位置,以防找到匹配项:
while (i + lenPart <= slen) {
if (s.substr(i, lenPart) == part) {
s.erase(i, lenPart);
} else {
i++;
}
}
注意:对于
std::size_t
、lenPart
和 slen
,请使用正确的类型 i
。