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 ) (включая начало, но не включая конец)
Append Char To String in C?
To append a char to a string in C, you first have to ensure that the memory buffer containing the string is large enough to accomodate an extra character. In your example program, you’d have to allocate a new, additional, memory block because the given literal string cannot be modified.
First, use malloc to allocate a new chunk of memory which is large enough to accomodate all characters of the input string, the extra char to append — and the final zero. Then call strcpy to copy the input string into the new buffer. Finally, change the last two bytes in the new buffer to tack on the character to add as well as the trailing zero.
Урок №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.
14 Answers 14
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.