在某些情况下抛出“std::out_of_range”错误实例后调用终止,例如当 s(string) = eemckxmckx 和部分(substring) =emckx

问题描述 投票:0回答:1

在一个带有两个参数字符串

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;
}
c++ string c++11 data-structures
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.