Страницы

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

среда, 29 января 2020 г.

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

#cpp #строки #циклы


Имеется код:

#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;
}


Цикл завершается тогда, когда условие впервые принимает значение "истина", хотя цикл
должен продолжаться до конечного символа строки. Почему так происходит?
    


Ответы

Ответ 1



Правильно удалять так: 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 за уточнение!)

Ответ 2



Наверно по тому, что erase() удаляет часть строки начиная с позиции i, в результате str.length() уменьшается и становится равным 6, что меньше значения i равного 7. Условие в цикле становится ложным и он завершается.

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

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