Удалите все символы в строке, которые не являются алфавитными c в C ++ - PullRequest
0 голосов
/ 03 марта 2020

У меня есть строка a, banana Я хочу удалить пробел и запятую из строки. Мой код:

for(auto it = s.begin(); it != s.end(); ++it)
   if(!isalpha(*it)) s.erase(it);

Но я получаю A banana. Если я просто попробую с A banana, тогда я получу Abanana. Я не знаю, почему он не удаляет пробел, если перед этим стоит запятая?

Ответы [ 2 ]

5 голосов
/ 03 марта 2020

Это похоже на работу для std::remove_if:

auto new_end = std::remove_if(begin(s), end(s), [](char c)
{
    return !isalpha(c);
});

// remove_if returns the new end, we need to erase from that to the old end
// (see the "erase-remove" idiom, https://en.wikipedia.org/wiki/Erase–remove_idiom)
s.erase(new_end, end(s));

Проблема с вашим текущим кодом заключается в том, что erase изменяет Строка, по которой вы перебираете, и вы просто пропускаете (с it++) следующий символ в строке.

Вам нужно использовать итератор, возвращаемый erase в качестве следующего итератор для проверки:

for(auto it = s.begin(); it != s.end(); /* empty */)
{
    if(!isalpha(*it))
        it = s.erase(it);
    else
        ++it;
}
0 голосов
/ 03 марта 2020

Общая рекомендация по итерации массива и удалению из него элементов: итерация в обратном направлении

for(auto it = s.end() - 1; it >= s.begin(); it--)
    if(!isalpha(*it) || *it == ' ')
        s.erase(it);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...