Как прибавить к строке символ 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 некорректны.
Генерирует исключение 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
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
- we usually use push_back().
str_value.push_back(c) - use += .
str_value += c - 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.
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 ) (включая начало, но не включая конец)