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

Как прибавить к строке символ c

  • автор:

Как прибавить к строке символ c

Если надо добавить в конец строки другую строку, применяется метод 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() , которая удаляет все вхождения определенного символа в строке:

Урок №206. Вставка символов и строк в std::string

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

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

Обе функции вставляют символы/строки, начиная с определенного index std::string.

Генерируют исключение length_error, если результат превышает максимально допустимое количество символов.

Во второй версии функции insert() str не должен быть NULL .

bbb
bbmmmb
bbmmmaaab

А вот версия функции insert(), которая позволяет вставить с определенного index std::string подстроку.

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

Эта функция вставляет с определенного index std::string указанное количество символов ( num ) строки str , начиная со startindex -а.

Возвращает скрытый указатель *this, что позволяет «связывать» объекты.

Генерирует исключение out_of_range, если index или startindex некорректны.

https://amdy.su/wp-admin/options-general.php?page=ad-inserter.php#tab-8

Генерирует исключение length_error, если результат превышает максимально допустимое количество символов.

А вот версия функции insert(), с помощью которой в std::string можно вставить часть строки C-style.

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

Эта функция вставляет с определенного index std::string указанное количество символов ( len ) строки C-style str .

Возвращает скрытый указатель *this, что позволяет «связывать» объекты.

Генерирует исключение out_of_range, если index некорректен.

Генерирует исключение length_error, если результат превышает максимально допустимое количество символов.

Игнорирует специальные символы (такие как » ).

А вот версия функции insert(), которая вставляет в std::string один и тот же символ несколько раз.

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

Эта функция вставляет с определенного index std::string указанное количество вхождений ( num ) символа c .

Возвращает скрытый указатель *this, что позволяет «связывать» объекты.

Генерирует исключение out_of_range, если index некорректен.

Генерирует исключение length_error, если результат превышает максимально допустимое количество символов.

И, наконец, функция insert() имеет три разные версии, которые работают с итераторами.

void insert(iterator it, size_type num, char c)
iterator string::insert(iterator it, char c)
void string::insert(iterator it, InputIterator begin, InputIterator end)

Первая версия функции вставляет в std::string указанное количество вхождений ( num ) символа c перед итератором it .

Вторая версия функции вставляет в std::string одиночный символ c перед итератором it и возвращает итератор в позицию вставленного символа.

Третья версия функции вставляет в std::string все символы диапазона (begin, end) перед итератором it .

Все функции генерируют исключение length_error, если результат превышает максимально допустимое количество символов.

How to append a char to a std::string?

I also tried, the following, which compiles but behaves randomly at runtime:

Sorry for this dumb question, but I’ve searched around google, what I could see are just «char array to char ptr», «char ptr to char array», etc.

15 Answers 15

I would use += operator instead of named functions.

To add a char to a std::string var using the append method, you need to use this overload:

Edit : Your’re right I misunderstood the size_type parameter, displayed in the context help. This is the number of chars to add. So the correct call is

Or the simpliest way :

In addition to the others mentioned, one of the string constructors take a char and the number of repetitions for that char. So you can use that to append a single char.

I test the several propositions by running them into a large loop. I used microsoft visual studio 2015 as compiler and my processor is an i7, 8Hz, 2GHz.

According to this test, results are :

Conclusion

+= seems more understandable, but if you mind about speed, use append

jdhao's user avatar

Try the += operator link text, append() method link text, or push_back() method link text

The links in this post also contain examples of how to use the respective APIs.

the problem with:

is that you have to have the ‘d’ as opposed to using a name of a char, like char d = ‘d’; Or am I wrong?

Note that in all of these examples you could have used a character literal directly: y += ‘d’; .

Your second example almost would have worked, for unrelated reasons. char d[1] = < 'd'>; didn’t work, but char d[2] = < 'd'>; (note the array is size two) would have been worked roughly the same as const char* d = «d»; , and a string literal can be appended: y.append(d); .

Also adding insert option, as not mentioned yet.

Try using the d as pointer y.append(*d)

I found a simple way. I needed to tack a char on to a string that was being built on the fly. I needed a char list; because I was giving the user a choice and using that choice in a switch() statement.

I simply added another std::string Slist; and set the new string equal to the character, «list» — a, b, c or whatever the end user chooses like this:

Complexity may be cool but simplicity is cooler. IMHO

  1. we usually use push_back().
    str_value.push_back(c)
  2. use += .
    str_value += c
  3. use append method.
    str_value.append(1,c)
    And you can learn more about the methods of string from http://www.cplusplus.com/reference/string/string/

Notice I have written 10u and not 10 for the number of times I’d like to append the character; replace 10 with whatever number.

Mat's user avatar

Supplementary answer, because apparently this answer with many upvotes is suggesting to use push_back(‘c’) while another is suggesting not to. Since both answers were a bit old, let’s have an update.

Using the STL, libstdc++ by the GNU, the performance of the following 5 methods of appending a char to a std::string will be tested: str.append() , str += ‘c’ , str.resize(str.size() + 1, ‘c’) , str.push_back(‘c’) , and str.insert(str.end(), 1, ‘c’) .

Let t be the minimum time used amongst the operations, the results are as follows:

params \ cpu_time (4dp) append() += resize() push_back() insert()
optim = none
compiler = Clang 11.0
std = c++11
2.6255
1.1t
2.4826
t
3.3396
1.3t
2.4759
t
4.5967
2t
optim = none
compiler = Clang 15.0
std = c++20
14.1841
1.5t
9.3077
t
15.7846
1.7t
9.7907
1.1t
27.1050
2t
optim = O3
compiler = Clang 11.0
std = c++11
19.1018
2t
9.9812
t
25.1597
2.5t
10.0466
t
17.5578
2t
optim = O3
compiler = Clang 15.0
std = c++20
9.9465
t
9.8468
t
9.9519
t
9.8686
t
9.9145
t

The += operator and push_back() are consistently the quickest method, followed by append() (1.1t — 2t), resize() (1.3t — 2.5t), and insert() (2t)

22.6 – Добавление данных к объектам std::string

Добавить строку в конец существующей строки легко, для этого необходимо воспользоваться функцией operator+= , append() или push_back() .

string& string::operator+= (const string& str)
string& string::append (const string& str)

Эти функции добавляют к строке символы str .

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

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

string& string::append (const string& str, size_type index, size_type num)

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

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

operator+= и append() также имеют версии, которые работают со строками в стиле C.

string& string::operator+= (const char* str)
string& string::append (const char* str)

Эти функции добавляют к строке символы str .

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

Есть еще один дополнительный вариант append() , который работает со строками в стиле C:

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

Добавляет в строку первые len символов строки str .

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

Эта функция опасна, и ее использование не рекомендуется.

Также есть набор функций, которые добавляют символы. Обратите внимание, что имя неоператорной функции для добавления символа – push_back() , а не append() !

string& string::operator+= (char c)
void string::push_back (char c)

Эти функции добавляют к строке символ c .

  • operator+= возвращает *this , чтобы его можно было вставить в «цепочку».
  • Обе функции вызывают исключение length_error , если результат превышает максимальное количество символов.

Вам может быть интересно, почему имя этой функции – push_back() , а не append() . Это следует соглашению об именах, используемому для стеков, где push_back() – это функция, которая добавляет один элемент в конец стека. Если вы представляете строку, как стек символов, то для добавления одного символа в ее конец имеет смысл использовать push_back() . Однако, на мой взгляд, отсутствие функции append() выбивается из последовательности!

Оказывается, есть функция append() для символов, которая выглядит так:

string& string::append (size_type num, char c)

Добавляет количество вхождений символа c в строку

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

Есть еще один, последний, вариант append() , который вы не поймете, если не знаете, что такое итераторы. Если вы не знакомы с итераторами, можете игнорировать эту функцию.

string& string::append (InputIterator start, InputIterator end)

Добавляет все символы из диапазона [ start , end ) (включая начало, но не включая конец)

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

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