#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. Условие в цикле становится ложным и он завершается.
Комментариев нет:
Отправить комментарий