Имеется код:
#include
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++ — использование
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 за уточнение!)
Комментариев нет:
Отправить комментарий