Страницы

Поиск по вопросам

воскресенье, 31 марта 2019 г.

Некорректная фильтрация строки

Имеется код:
#include #include using namespace std;
int main() { string str = "Hallow, world"; int i = 0; for (i; i < str.length(); i++) { if (str[i] == ',') { str.erase(i); }; }; cout << str; return 0; }
Цикл завершается тогда, когда условие впервые принимает значение "истина", хотя цикл должен продолжаться до конечного символа строки. Почему так происходит?


Ответ

Правильно удалять так:
for (; i < str.length();) { if (str[i] == ',') str.erase(i, 1); else i++; };
Таким образом вы удаляете каждый раз по одному символу. Кроме того, при удалении символы сдвигаются, так что вам нужно перепроверить текущий индекс. Поэтому i++ ушло в else. (Кроме того, в таком виде for можно заменить на while.)
Более идиоматический метод удаления из строки в C++ — использование и идиомы erase/remove:
str.erase(std::remove(str.begin(), str.end(), ','), str.end());
или, если хочется более сложного условия,
str.erase(std::remove_if(str.begin(), str.end(), [](char x){ return x == ','; }), str.end());
(Спасибо @Vlad from Moscow за уточнение!)

Комментариев нет:

Отправить комментарий