C++
Как убрать один символ из строки в C++: erase по индексу и remove
Чтобы убрать один символ из строки `std::string` в C++, чаще всего используют метод `erase`. Если известен индекс символа, пишут:.
Ниже — разделы про удалить символ по индексу, проверить индекс перед удалением и удалить первый найденный символ, чтобы быстро понять устройство материала, практические ограничения и типовые точки отказа.
Чтобы убрать один символ из строки std::string в C++, чаще всего используют метод erase. Если известен индекс символа, пишут:
text.erase(pos, 1);
Первый аргумент — позиция, второй — количество символов для удаления. Для одного символа количество равно 1
Удалить символ по индексу
Пример:
#include <iostream>
#include <string>
int main() {
std::string text = "hello";
text.erase(1, 1);
std::cout << text << "\n";
return 0;
}
Вывод:
hllo
Индекс 1 указывает на букву e, потому что в C++ индексация начинается с нуля:
h e l l o
0 1 2 3 4
Проверить индекс перед удалением
Если индекс пришел от пользователя или из расчета, лучше проверить границы:
#include <iostream>
#include <string>
int main() {
std::string text = "hello";
std::size_t pos = 10;
if (pos < text.size()) {
text.erase(pos, 1);
} else {
std::cout << "Такой позиции нет\n";
}
std::cout << text << "\n";
return 0;
}
Так программа не попытается удалить символ за пределами строки
Удалить первый найденный символ
Если нужно убрать, например, первый дефис, сначала найдите позицию через find:
#include <iostream>
#include <string>
int main() {
std::string text = "2026-06-02";
std::size_t pos = text.find('-');
if (pos != std::string::npos) {
text.erase(pos, 1);
}
std::cout << text << "\n";
return 0;
}
Результат:
202606-02
Удалился только первый найденный дефис. Остальные остались
Удалить через итератор
У std::string::erase есть перегрузка, которая принимает итератор. Она удобна, если позиция уже получена как итератор:
#include <iostream>
#include <string>
int main() {
std::string text = "hello";
auto it = text.begin() + 1;
text.erase(it);
std::cout << text << "\n";
return 0;
}
Результат будет тот же:
hllo
Но с итератором тоже нужно быть аккуратным: нельзя удалять через итератор, который указывает за конец строки. Если позиция пришла извне, сначала проверьте ее
Удалить все такие символы
Если нужно убрать все дефисы, пробелы или запятые, удобен прием erase-remove:
#include <algorithm>
#include <iostream>
#include <string>
int main() {
std::string text = "2026-06-02";
text.erase(std::remove(text.begin(), text.end(), '-'), text.end());
std::cout << text << "\n";
return 0;
}
Вывод:
20260602
std::remove не удаляет символы физически, а переставляет элементы и возвращает новую логическую границу. Метод erase уже реально сокращает строку
Удалить последний символ
Если нужно убрать последний символ строки:
if (!text.empty()) {
text.pop_back();
}
pop_back проще, чем erase(text.size() - 1, 1), но перед ним важно проверить, что строка не пустая
Что с русскими буквами
Если строка в UTF-8 содержит русские буквы, один видимый символ может занимать несколько байтов. std::string::erase(pos, 1) удаляет один байт, а не обязательно одну букву. Для латиницы это обычно не проблема. Для Unicode-текста нужен аккуратный разбор кодировки
Частые ошибки
Забыть, что индексы начинаются с нуля
Первый символ имеет индекс 0, второй — 1, третий — 2
Использовать remove без erase
Так строка не станет короче:
std::remove(text.begin(), text.end(), '-');
Нужна связка:
text.erase(std::remove(text.begin(), text.end(), '-'), text.end());
Удалять из пустой строки
Перед pop_back и расчетом text.size() - 1 проверяйте empty()
Короткий вывод
Чтобы удалить один символ по индексу, используйте text.erase(pos, 1). Чтобы удалить первый найденный символ, найдите позицию через find. Чтобы удалить все одинаковые символы, применяйте erase-remove
Связанные материалы:
Что почитать дальше по C++
Если нужен общий маршрут по теме, откройте рубрику C++. Для соседних задач пригодятся эти разборы:
- Как очистить переменную string в C++: clear, присваивание пустой строки и erase
- Enter в C++: перенос строки, std::endl и ввод через cin
- length в C++: длина строки, vector, массива и C-строки
- Как отделить буквы от цифр в C++: isalpha, isdigit и две строки