Как удалить string c
Перейти к содержимому

Как удалить string c

  • автор:

Удаление определенных символов из строки

Не могу понять, почему программа выходит за рамки строки, ведь строго обозначен символ, который надо удалить.

Отслеживать
51.6k 204 204 золотых знака 67 67 серебряных знаков 251 251 бронзовый знак
задан 10 июл 2020 в 18:22
Александр II Александр II
105 1 1 золотой знак 1 1 серебряный знак 11 11 бронзовых знаков

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

эффективнее решить задачу можно с использованием идиомы erase-remove:

 std::string a = "agaga"; a.erase(std::remove(a.begin(), a.end(), 'a'), a.end()); std::cout  

обьяснение: remove смещает элементы не равные 'a' в начало строки в том же порядке в каком они были изначально, потом возвращает итератор на первый элемент равный 'a' (эти элементы лежат в хвосте строки), и затем erase затирает ненужные элементы от начала этого итератора и до конца

Удаление определенных символов из строки

Не могу понять, почему программа выходит за рамки строки, ведь строго обозначен символ, который надо удалить.

Отслеживать
51.6k 204 204 золотых знака 67 67 серебряных знаков 251 251 бронзовый знак
задан 10 июл 2020 в 18:22
Александр II Александр II
105 1 1 золотой знак 1 1 серебряный знак 11 11 бронзовых знаков

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

эффективнее решить задачу можно с использованием идиомы erase-remove:

 std::string a = "agaga"; a.erase(std::remove(a.begin(), a.end(), 'a'), a.end()); std::cout  

обьяснение: remove смещает элементы не равные 'a' в начало строки в том же порядке в каком они были изначально, потом возвращает итератор на первый элемент равный 'a' (эти элементы лежат в хвосте строки), и затем erase затирает ненужные элементы от начала этого итератора и до конца

string в C++: строки простыми словами

В стандартной библиотеке C++ std::string является ключевым классом для работы со строками. Этот класс предоставляет разработчикам удобный способ управления и манипуляции строками, заменяя традиционные массивы символов. В этой статье мы рассмотрим основные аспекты std::string и его возможности в C++.

Что такое строки (string) в C++

Иллюстрация строк в C++

string - это более удобная альтернатива строками в стиле C, которую можно использовать в C++. Внутреннее устройство string похоже на вектор символов, мы можем изменять строку и ее размер на лету.

Давайте рассмотрим простой пример работы со строками в C++:

#include using namespace std; int main()  string greeting = "Привет"; // инициализация строки string world("Мир"); // явный вызов конструктора string exclamation'!'>; // инициализация как массива символов cout   <" "    ; return 0; > 

Вывод данной программы:

Привет Мир!

Теперь давайте разберем, что делает данная программа:

  1. в строке 6 мы присваиваем значение переменной типа string при помощи оператора = . Этот вариант вы будете встречать наиболее часто.
  2. в строке 7 мы явно вызываем конструктор string и передаем туда нужную нам строку.
  3. в строке 8 мы используем тот факт, что строка работает как вектор символов, поэтому мы можем использовать конструкцию вида , , . > .
  4. в строке 10 мы выводим строки на экран используя стандартный cout .

Теперь давайте рассмотрим операции, которые мы можем производить над строками.

Объединение строк (конкатенация)

Чтобы соединить две строки достаточно воспользоваться оператором + :

string c = "С"; string pp = "++"; string cpp = c + pp; cout  "cpp token operator"> cpp  endl;
cpp = C++

При этом не обязательно соединять значения из нескольких переменных. Мы можем объединить строку с C строкой "строка в формате C" (массивом символов char[] ):

string c = "С"; string cpp = c + "++"; cout  "cpp token operator"> cpp  endl;

Нельзя соединить два строковых литерала "C" + "++" , поскольку оператор + не определен на массивах типа char[] . Для того чтобы сложить две строки при помощи + , обязательно на одной из сторон оператора + должна находиться строка string .

Вывод программы идентичен предыдущему:

cpp = C++

Помимо оператора + , есть метод append , который позволяет добавить одну строку к другой:

string lang = "С"; lang.append("++"); cout  "lang token operator"> lang  endl;
lang = C++

Отличие метода append от + заключается в том, что append меняет существующую строку, в то время как + создает новую.

Поскольку append меняет существующую строку, он работает быстрее чем + особенно при многократных слияниях строк.

Стоит отметить, что нельзя получить сумму чисел внутри строки при помощи оператора + . Давайте рассмотрим пример:

string a = "12"; string b = "34"; cout  "a + b token operator"> a + b  endl;
a + b = 1234

Как вы видите, сложение просто добавило цифры одной строки в конец другой. Если мы попробуем сложить строку с числом, то получим ошибку компиляции. Код в следующем примере не скомпилируется:

string a = "12"; cout  a + 34  endl; // Invalid operands to binary expression ('std::string' and 'int')

Что будет выведено на экран:

string a = "23"; string b = "45"; cout  a + b  endl;

Когда две строки конкатенируются с использованием оператора + , их содержимое просто объединяется. Таким образом, "23" + "45" дает "2345" , а не математическую сумму чисел.

Получение длины строки

Чтобы получить длину строки, мы можем воспользоваться методом length :

string s = "C++"; cout  "s.length() token operator"> s.length()  endl;
s.length() = 3

У метода length есть “брат-близнец” - size :

string s = "C++"; cout  "s.size() token operator"> s.size()  endl;
s.size() = 3

Между ними нет разницы, поэтому вы можете выбрать название метода на свой вкус.

Получение и изменение символа в строке

string позволяет нам получать любой символ по указанному индексу при помощи оператора [] . При этом можно также использовать метод at , однако оператор [] является более компактным и встречается чаще в реальных программах:

string s = "ABCDE"; cout  "s[1] token operator"> s[1]  endl;

Первый символ в строке имеет индекс 0 .

s[1] = B

Так же, как и с массивами, мы можем присвоить любой ячейке новое значение:

string s = "ABCDE"; s[1] = 'X'; cout  "s[1] token operator"> s[1]  endl;
s[1] = X

Изменение символа в строке

А как же нам объявить строку, которая состоит из двух линий? Для этого достаточно воспользоваться специальным символом \n :

string s = "Первая строка.\nВторая строка"; cout  s  endl;
Первая строка. Вторая строка

В C++ все специальные символы в строках начинаются с \ . Вот примеры часто используемых специальных символов:

  • \n - перенос строки
  • \' - одинарная кавычка
  • \" - двойная кавычка
  • \\ - обратный слеш

Что будет выведено на экран:

cout  "Привет, мир\\nПривет снова!"  endl;

Привет, мир
Привет снова!
Привет, мир Привет снова!
Привет, мир\nПривет снова!
Привет, мир\nПривет\nснова!

В C++ все специальные символы в строках начинаются с \ . \\ используется для вывода обратного слеша. Поэтому вывод будет “Привет, мир\nПривет снова!” без перехода на новую строку.

Ввод строк из консоли используя cin

cin позволяет нам вводить строки напрямую из консоли. Для этого достаточно указать переменную типа string в которую будет записана строка введенная пользователем:

string name; cout  "Введите ваше имя: "; cin >> name; cout  "Ваше имя: "  name  endl;

Пример работы программы:

Введите ваше имя: Дима Ваше имя: Дима

Однако, если мы попытаемся ввести строку с пробелом, то cin считает строку только до первого пробела. Если мы хотим считать строку полностью, нужно использовать функцию getline :

string name; cout  "Введите ваше имя: "; getline(cin, name); cout  "Ваше имя: "  name  endl;

Пример работы программы:

Введите ваше имя: Вася Пупкин Ваше имя: Вася Пупкин

Теперь давайте познакомимся подробнее с методами, которые есть у string .

Методы для строк

Мы уже видели несколько методов: length , size и append . Однако у строк есть еще много полезных функций, которые упростят вам жизнь:

  • begin/end - получить итератор для строки
  • empty - проверка на пустоту
  • clear - очистка строки
  • front/back - получить первый/последний символ
  • insert - вставить подстроку
  • erase - удалить подстроку
  • replace - изменить подстроку
  • find - найти подстроку
  • compare - сравнить две строки

string — это контейнер в C++. Как и другие контейнеры в C++, он предоставляет возможность обхода своих элементов. Для этого можно использовать итераторы, получаемые с помощью методов begin и end :

string s = "123"; for (auto it = s.begin(); it != s.end(); it++)  cout  <*it  <" "; >

Вывод данной программы:

1 2 3

Чтобы получить вывод 3 2 1 , нужно использовать методы rbegin / rend вместо begin / end .

Вместо того, чтобы писать s.length() == 0 , мы можем воспользоваться методом empty :

string s = ""; cout  "s token operator"> (s.empty() ? "" : s)  endl;

Метод clear позволяет нам очистить существующую строку:

string s = "Длинная строка"; cout  "s token operator"> s  endl; s.clear(); cout  "s token operator"> (s.empty() ? "" : s)  endl;
s = Длинная строка s =

Вместо обращения к индексам 0 и s.length() - 1 напрямую, можно воспользоваться методами front и back :

string s = "12345"; cout  "front token operator"> s.front()  endl; cout  "back token operator"> s.back()  endl;
front = 1 back = 5

Метод insert позволяет нам добавить символы в любую часть существующей строки:

string s = "125"; s.insert(2, "34"); cout  "s token operator"> s  endl;
s = 12345

Первый аргумент метода insert указывает, куда вставить. Второй аргумент - это подстрока, которую следует вставить по указанному индексу.

Метод erase удаляет часть строки:

string s = "123__45"; s.erase(3, 2); cout  "s token operator"> s  endl;
s = 12345

erase принимает два аргумента:

  1. позиция, с которой начинать удалять
  2. сколько символов нужно удалить

Метод replace является комбинацией методов erase и insert :

string s = "12__5"; s.replace(2, 2, "34"); cout  "s token operator"> s  endl;
s = 12345

Метод replace принимает:

  1. позиция, с которой начинать замену
  2. количество символов, которые нужно заменить
  3. строка, на которую нужно заменить

Метод find позволяет нам найти подстроку в другой строке. Данный метод принимает строку, которую нужно найти. В случае если строку удалось найти, мы получим индекс первого вхождения данной подстроки. Если же подстроку найти не удалось, find вернет -1 :

string s = "Не имей сто рублей, а имей сто друзей."; int index = s.find("сто"); cout  "индекс первого вхождения \"сто\" token operator"> index  endl; index = s.find("миллион"); cout  "index token operator"> index  endl;

Вывод данной программы:

индекс первого вхождения "сто" = 14 index = -1

Вас может удивить индекс вхождения подстроки “сто”. Все дело в том, что string хранит набор байт. Русские символы занимают два байта в отличии от пробела или цифр. Получается: “Не” - 4 байта, ” ” - 1 байт, “имей” - 8 байт, ” ” - 1 байт. В сумме - 14 байт. Вы можете подробнее почитать почему разные символы используют разное количество байт в статье про UTF-8.

Что будет выведено на экран:

string s = "Привет, мир!"; int index = s.find("мир"); cout  "index token operator"> index  endl;

В строке “Привет, мир!” подстрока “мир” начинается после “Привет, “. “Привет, ” занимает 14 байт (2 * 6 байта для слова “Привет” и 2 байта на запятую с пробелом), поэтому index равен 14 .

Закончим мы на методе compare . Данный метод позволяет нам сравнить две строки и узнать, какая из них лексикографически больше. a.compare(b) вернет:

Вот наглядный пример:

string a = "123"; string b = "43"; string c = "1234"; cout  "123.compare(123 ) token operator"> a.compare(a)  endl; cout  "123.compare(43 ) token operator"> a.compare(b)  endl; cout  "123.compare(1234) token operator"> a.compare(c)  endl; cout  "43 .compare(1234) token operator"> b.compare(c)  endl;
123.compare(123 ) = 0 123.compare(43 ) = -1 123.compare(1234) = -1 43 .compare(1234) = 1

Если вывод вам кажется неправильным, я советую почитать подробнее про лексикографический порядок по ссылке выше.

  1. Использование front и back :
    Напишите программу, которая:
    • Запрашивает у пользователя строку.
    • Используя методы front и back , выводит на экран первый и последний символы этой строки.
  2. Редактирование строки:
    Разработайте программу, которая:
    • Запрашивает у пользователя исходную строку.
    • Предоставляет меню с 4 опциями: insert , erase , replace , и find .
    • В зависимости от выбора пользователя, программа предоставляет инструкции для использования соответствующего метода и выводит результат.
  3. Сравнение строк с помощью compare :
    Напишите программу, которая:
    • Запрашивает у пользователя две строки.
    • Использует метод compare для сравнения этих строк.
    • Выводит на экран результат сравнения (какая строка лексикографически больше, или если они равны).

Читайте также

string::find в C++

C++ предоставляет множество способов поиска в строках. Метод string::find - один из наиболее часто используемых методов для поиска подстрок. В этой статье вы узнаете, как эффективно использовать этот мето

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *