它失败了,因为您在所有情况下都增加了索引。仅当您不删除字符时才应该这样做,因为删除会将超出该点的所有字符向后移动一个。
换句话说,只要有两个或多个连续字符要删除,就会出现这个问题。它不是将它们都删除,而是将它们“折叠”成一个。
通过你的函数运行它两次将在那个特定的输入字符串上工作,但你仍然会遇到像“(((((pax))))”这样的问题,因为第一次调用会将它折叠为“((pax))”第二个会给你“(pax)”。
一种解决方案是在删除字符时不推进索引:
std::string sanitize (std::string word) {
int i = 0;
while (i < word.size()) {
if(word[i] == '(' || word[i] == ')') {
word.erase(i,1);
continue;
}
i++;
}
return word;
}
但是,我会更智能地使用该语言的功能。C++ 字符串已经具有搜索字符选择的能力,这可能比用户循环优化得多。因此,您可以使用更简单的方法:
std::string sanitize (std::string word) {
int spos = 0;
while ((spos = word.find_first_of ("()", spos)) != std::string::npos)
word.erase (spos, 1);
return word;
}
您可以在以下完整程序中看到这一点:
#include <iostream>
#include <string>
std::string sanitize (std::string word) {
int i = 0;
while ((i = word.find_first_of ("()", i)) != std::string::npos)
word.erase (i, 1);
return word;
}
int main (void) {
std::string s = "((3)8)8)8)8))7 ((((pax))))";
s = sanitize (s);
std::cout << s << '\n';
return 0;
}
输出:
388887 pax