§ 9. Строковые величины

9.4. Копирование, вставка, замена и удаление символов

При работе с текстом часто приходится выделять и преобразовывать части строк. Часть текста (подстроку) можно скопировать или вырезать, а затем вставить в другое место в тексте. Строка или ее часть может быть заменена на другую строку. Команды для выполнения операций по работе с фрагментом текста представлены в таблице.

Команда Описание
substr(n, k) Копирует часть строки в другую строку
erase(n, k) Удаляет символы строки
insert(n, s1) Вставляет подстроку s1 в строку  
replace(n, k, s1) Заменяет символы строкой s1
Empty() Возвращает true, если строка пуста, false — если не пуста
Push_back(c) Добавляет в конец строки символ с
Pop_back() Удаляет один символ в конце строки

Во всех командах переменная n обозначает позицию (номер) символа, начиная с которого выполняют операцию, а переменная k — количество символов. Разберем команды подробнее (пример 9.9).

В результате выполнения команды substr строка s не изменяется. Результат работы функции присваивается другой строке.

Команды erase, insert и replace изменяют исходную строку s.

В примере 9.10 показано, как применяются указанные команды.

Функции insert и replace имеют еще один вариант реализации. Этот вариант позволяет использовать при вставке не всю строку s1, а только ее часть. В этом случае задаются два дополнительных параметра: позиция n1 и количество символов k1, относящихся к строке s1. Параметры позволяют выделить подстроку в строке s1, которая и вставляется в исходную строку:

insert(n, s1, n1, k1),

replace(n, k, s1, n1, k1).

Пример 9.11. Написать программу, которая определит, сколько раз встречается заданная подстрока в строке.

Этапы выполнения задания

I. Исходные данные: переменная s — исходная строка, p — исходная подстрока.

II. Результат: k — искомое количество.

III.  Алгоритм решения задачи.

1. Вводим исходные данные. 
2. Инициализируем значение счетчика k = 0.
3. Определяем длины n1 и n2 для строки s и подстроки p.
4. В цикле for от 1 до разницы в длинах строки s и подстроки p.

4.1. Выделим из строки s подстроку t такой же длины, что и длина p, начиная с текущего символа. 
4.2. Сравним подстроки. Если они равны, то увеличиваем значение счетчика на 1.

5. Вывод результата.

IV. Описание переменных: s, p, t — string, n1, n2, k — int.

Пример 9.9. Команды для преобразования строк.

1. Запись s1 = s.substr(n, k); означает, что в строке s выделяют k символов, начиная с символа, индекс которого записан в переменной n. Символы копируются в переменную s1 (действие команды сравнимо с копированием фрагмента текста в буфер обмена).

2. Запись s.erase(n, k); означает, что в строке s выделяют k символов, начиная с символа, индекс которого записан в переменной n. Выделенные символы удаляются из строки s. Остальные символы строки сдвигаются влево (действие команды сравнимо с удалением фрагмента текста).

3. Запись s.insert(n, s1); означает, что в строку s вставляют символы строки s1, вставка происходит в позиции n. Остальные символы строки сдвигаются вправо (действие команды сравнимо со вставкой фрагмента текста из буфера обмена в позицию курсора).

4. Запись s.replace(n, k, s1); означает, что символы строки s заменяют на символы строки s1. Заменяются k символов, начиная с символа, стоящего в позиции n. Остальные символы строки сдвигаются (действие команды сравнимо со вставкой фрагмента текста из буфера обмена на место выделенного фрагмента).

Пример 9.10. Примеры использования команд (команды применяются последовательно).

Исходная строка

 string s = "informatics";

Команда

Результат

 s1 = s.substr(2,5);

s1 = "forma"

 s.erase(2, 7);

s = "incs"

 s.replace(2, 2, "ion");

s = "inion"

 s1 = "format";

 s.insert(2, s1);

 s = "information"

Пример 9.11.

V. Программа:

#include <iostream>

#include <string>

 

using namespace std;

using namespace std::__cxx11;

 

int main()

{

  string s, p;

  cout << "stroka" << endl;

  getline(cin, s);

  cout << "podstroka" << endl;

  getline(cin, p);

  int n1 = s.length();

  int n2 = p.length();

  int k = 0;

  for (int i = 0; i < n1 - n2 + 1; i++){

    string t = s.substr(i, n2);

    if (== p)

      k++;

  }

  cout << k << " raz" << endl;

  return 0;

}

VI. Тестирование.

 

Эффективное решение данной задачи можно получить с помощью алгоритма КнутаМориса—Пратта (КНП-алгоритм)[1].


[1] Котов В. М., Лапо А. И., Быкадоров Ю. А., Войтехович Е. Н. Информатика, 9 класс. Минск: Народная асвета, 2019. С. 44.