Как добавить элемент в начало строки с

от admin

Как добавить элемент в начало строки с

Если надо добавить в конец строки другую строку, применяется метод append() , в который передается добавляемая строка:

Вставка строки

Для вставки одной строки в другую применяется функция insert() . Она имеет несколько различных версий. Самая простая версия принимет индекс вставки и вставляемую строку:

В данном случае в строку text начиная с 7-го индекса вставляем строку str. В итоге переменная text будет равна «insert a string into a text».

Также можно вставлять строковый литерал:

Можно вставлять часть подстроки:

Здесь в text вставляем из переменной langs 3 символа с 5-го индекса, то есть подстроку » C,».

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

В данном случае вставляем в строку text символ * 5 раз начиная с 8 индекса.

Замена подстроки

Для замены в строке некоторой части применяется функция replace() . Эта функция также имеет много версий, поэтому рассмотрим самые распространенные.

Самая простая версия принимает три параметра:

Первый параметр — представляет индекс, с которого надо заменять подстроку. Второй параметр — количество заменяемых символов. Третий параметр — на какую строку надо заменить. Пример:

Здесь в строке text заменяем 4 символа с 6-го индекса на строку «C++». Таким образом, из строки «Lang: Java» мы получим строку «Lang: C++».

В предыдущем примере символы заменялись на строковый литерал. Но также можно заменять на объект string:

Нередко стоит задача заменить какой-то определенную подстроку, индекс которой может быть не известен. В этом случае мы можем воспользоваться поиском в строке, чтобы найти индекс подстроки и ее размер. Например, возьмем текст «Hello, Tom!» и заменим подстроку «Tom» на «Bob»:

Здесь находим позицию первого символа подстроки «Tom» в тексте и сохраняем ее в переменную start. Символ, следующий за последним символом подстроки «Tom», находится путем поиска символа разделителя из строки separators с помощью функции find_first_of() . Далее используем найденные позиции индекса в replace() .

Однако в тексте может быть множество вхождений определенной подстроки (в нашем случае строки «Tom»), и может встать задача заменить все эти вхождения. Для этого мы можем использовать циклы:

Здесь сначала находим индекс первого вхождения подстроки, которую надо заменить, и сохраняем этот индекс в переменную start. В цикле заменяем последовательно все вхождения подстроки. После каждой замены находим индекс следующего вхождения, сохраняем его в переменную start и повторяем цикл. Когда больше нет вхождений подстроки в текст, start будет содержать значение std::string::npos , что завершает цикл.

Из других версий функции replace() можно выделить функцию, которая заменяет подстроку определенным символом, который повторяется определенное количество раз:

Здесь заменяет в строке text 6 символов начиная с 9-го индекса на 5 символов *.

Удаление символов

Если надо не просто заменить символы, а удалить их из текста, также можно использовать функцию replace() — в этом случае удаляемые символы фактически заменяются на пустую строку:

Однако С++ также предоставляет для удаления символов специальную функцию — erase() . В качестве параметров она принимает начальный индекс удаления и количество удаляемых символов:

Аналогично можно удалить все вхождения определенной подстроки:

Функция erase() имеет ряд дополнительных версий. Так, можно оставить определенное количество символов с начала строки, а остальные удалить:

Если в функцию не передается никаких параметров, то она удаляет все символы, и в результате получаем пустую строку:

Стоит отметить, что в стандарт С++20 была добавлена функция std::erase() , которая удаляет все вхождения определенного символа в строке:

Запись в начало строки

Все можно сделать, используя стандартные C функции, объявленные в заголовке <string.h> .

Вывод программы на консоль

Если строка не дополнена нулями, то копировать надо не strlen( string ) символов, а strlen( string ) + 1 символ.

То есть в общем случае правильно будет записать

Как в своем комментарии указал Pink Tux, в общем случае вы должны проверять, содержит ли исходный массив достаточно места, чтобы можно было сдвинуть вправо хранящуюся в нем строку.

22.7 – Вставка данных в объекты std::string

Вставить символы в существующую строку можно с помощью функции insert() .

string& string::insert (size_type index, const string& str)
string& string::insert (size_type index, const char* str)

Эти функции вставляют символы str в строку в место, определенное значением index .

  • Обе функции возвращают *this , чтобы их можно было объединить в «цепочку».
  • Обе функции выбрасывают исключение out_of_range , если значение индекса недопустимо.
  • Обе функции вызывают исключение length_error , если результат превышает максимальное количество символов.
  • В версии со строкой в стиле C значение str не должно быть равно nullptr .

А вот безумная версия insert() , которая позволяет вставлять подстроку в строку в место по произвольному индексу:

string& string::insert (size_type index, const string& str, size_type startindex, size_type num)

Эта функция вставляет num символов str , начиная с startindex , в строку в место, определенное значеним index .

  • Возвращает *this , чтобы ее можно было вставить в «цепочку».
  • Выбрасывает исключение out_of_range , если index или startindex выходит за границы строки.
  • Выбрасывает исключение length_error , если результат превышает максимальное количество символов.

Также есть вариант insert() , который вставляет начальную часть строки в стиле C:

string& string::insert(size_type index, const char* str, size_type len)

Вставляет len символов строки str в строку в место с индексом index .

  • Возвращает *this , чтобы ее можно было вставить в «цепочку».
  • Выдает исключение out_of_range , если значение индекса недопустимо.
  • Выдает исключение length_error , если результат превышает максимальное количество символов.
  • Игнорирует специальные символы (например, " ).
Читать:
Как скачать мортал комбат мобайл на айфон

Также есть вариант insert() , который вставляет один и тот же символ несколько раз:

string& string::insert(size_type index, size_type num, char c)

Вставляет num экземпляров символа c в строку в место, определенное значением index .

  • Возвращает *this , чтобы ее можно было вставить в «цепочку».
  • Выдает исключение out_of_range , если значение индекса недопустимо.
  • Выдает исключение length_error , если результат превышает максимальное количество символов.

И, наконец, функция insert() также имеет три разные версии, в которых используются итераторы:

Пример 4. Вставка в строку символа

Для вставки символа должны быть заданы (кроме самой строки) позиция вставки и вставляемый символ. Отсчет позиций символов в этом примере такой же, как и в предыдущей задаче.

Для вставки требуется переместить часть строки от позиции вставки до конца строки вправо на одну позицию и на освободившееся место записать вставляемый символ. Для выполнения этой операции необходимо, чтобы позиция вставки была в пределах строки (включая символ конца строки), а длина строки после вставки не должна превышать объявленную длину строки. Номер позиции вставки символа отсчитывается, начиная с 1.

Перемещение части строки вправо можно выполнить тремя способами:

1. Скопировать часть строки до точки вставки в промежуточную строку, затем вставить символ. После этого в промежуточную строку скопировать оставшуюся часть. Схема обработки:

Пример этой программы приведен ниже.

// Вставка символа в строку с помощью дополнительной строки.

#include «stdafx.h» #include <conio.h> #include <iostream> using namespace std; #define SIZE 80

char st[SIZE], stp[SIZE], *pt, *qt, ch;

int w; // № позиции для вставки (отсчет от 1) cout << «Введите строку n»;

cout << «Введите номер позиции \n»; cin >> w;

cout << «Введите символ \n»; cin >> ch;

if (w < strlen(st) && w < SIZE — 1 && w > 0)

for (int i = 0; i < w — 1; i++)

stp[i] = st[i]; // Копирование до точки вставки stp[w — 1] = ch; // Вставка символа

// Настройка указателей для копирования остатка pt = st + w — 1;

while(*qt++ = *pt++); // Копирование остатка

cout << «Строка после вставки равна » << stp;

else cout << «Ошибка в данных»; _getch();

2. Настроить рабочие указатели на последний символ (со значением ‘\0’ ) строки и на символ, следующий за ним. После этого выполнить копирование указателей с декрементом (операция — ), пока не будет достигнута заданная позиция вставки. Условие окончания цикла выбирается из следующих соображений (см. 2-й цикл while в программе). Позиция вставки равна разности рабочего указателя ( pt) и указателя на начало строки ( st ), если отсчет позиций выполняется от 0. Поэтому номер позиции уменьшен на 1. После окончания этого цикла в позиции вставки останется символ, который был в этой позиции ранее, и этот же символ будет размещен и в следующей позиции (выполнялось копирование, а не пересылка). Теперь можно заменить символ в позиции вставки требуемым. Схема обработки представлена ниже.

// Программа вставки символа за счет сдвига строки вправо

#include «stdafx.h» #include <conio.h> #include <iostream> using namespace std; #define SIZE 17

char st[SIZE],*pt,*qt, ch; int w, len;

cout << «Введите строку\n»;

cout << «Введите номер позиции \n»; cin >> w;

cout << «Введите символ n»; cin >> ch;

len = strlen(st); // Эта функция возвращает длину без учета ‘\0′

if (w < len + 1 && w < SIZE — 1 && w > 0)

while(*pt ++); Поставить указатель на конец строки.

// После окончания цикла указатель за признаком конца строки,

// поэтому его надо возвратить на одну позицию обратно

// Второй указатель за концом строки

// Первый указатель на 1 позицию влево

while((pt — st) >= w — 1) // Копирование до позиции вставки

st[w — 1] = ch; // Вставка символа: место свободно cout << «Строка после вставки равна \n» << st;

else cout << «\n Ошибка в данных»; _getch();

3. Запомнить символ в точке вставки, на его место записать вставляемый символ. Аналогично поступить с запомненным символом, т.е. переносить символы по одному от точки вставки, а на освободившееся место записывать очередной символ. Для этого следует настроить указатели так же, как и при исключении, но простое копирование при этом не проходит потому, что предыдущий символ будет переписываться на место последующего, и будет затирать его. Поэтому при переносе вправо одиночного символа, сначала следует прочесть и сохранить последующий символ, затем в текущую позицию строки записать символ, сохраненный на предыдущем шаге. В примере программы для промежуточного

хранения символа использована переменная t . Для подготовки к выполнению следующего шага цикла в переменную t переписывается символ, сохраненный в текущем шаге. После этого наращивается рабочий указатель.

Ниже приведена схема вставки символа в строку этим методом (метод «переката»). Ниже показано содержимое переменных на первом шаге «переката».

На следующем рисунке показано содержимое переменных после первого шага перестановок (буква ‘o’ вставлена, все готово для вставки буквы ‘д’).

Похожие статьи