すべての場合でインデックスをインクリメントしているため、失敗しています。削除すると、そのポイントを超えるすべての文字が1つ戻るため、文字を削除しない場合にのみこれを行う必要があります。
つまり、削除する連続する文字が 2 つ以上ある場合、この問題が発生します。両方を削除するのではなく、2 つを 1 つに「折りたたみ」ます。
関数を2回実行すると、その特定の入力文字列で機能しますが、最初の呼び出しで「((pax))」に折りたたまれるため、「((((pax))))」のような問題が発生します。 2番目は「(pax)」を提供します。
解決策の 1 つは、文字を削除するときにインデックスを進めないことです。
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