7. Мы также можем преобразовать эту новую строку путем, например, перевода всех ее символов в верхний регистр. Библиотечная функция C toupper
std::transform
, поскольку строка, по сути, представляет собой итерабельный контейнер, содержащий элементы типа char
. transform(begin(concatenated), end(concatenated),
begin(concatenated), ::toupper);
cout << concatenated << '\n';
}
8. Компиляция и запуск программы дадут следующий результат, который полностью оправдывает наши ожидания:
$ ./creating_strings
a, b
c, d
ab
ac
a b c d
A B C D
Как это работает
Очевидно, строки можно складывать с помощью оператора +
string_view
, сначала нужно выполнить их преобразование к типу std::string
.Однако очень важно отметить: при объединении в коде строк и строковых представлений мы никогда не должны предполагать, что хранящаяся в экземпляре класса string_view
"abc"s + string{some_string_view}
вместо конструкции "abc"s + some_string_view.data()
. Кроме того, класс std::string
предоставляет функцию-член append
, которая может работать с экземплярами класса string_view
, но изменяет строку вместо того, чтобы вернуть новую строку, к которой прикреплено содержимое строкового представления. std::string_view
Сложную конкатенацию строк с форматированием и т.д. не следует выполнять шаг за шагом для экземпляров строк. Классы std::stringstream
std::ostringstream
и std::istringstream
подходят для этого гораздо лучше, так как позволяют более качественно управлять памятью при объединении строк и предоставляют все возможности по форматированию, характерные для потоков. Для данного раздела мы выбрали класс std::ostringstream
, поскольку собираемся создать строку вместо того, чтобы ее анализировать. Экземпляр класса std::istringstream
можно создать на основе существующей строки, которая при необходимости преобразуется в переменные других типов. Если мы хотим объединить обе возможности, то нам подойдет класс std::stringstream
.Удаляем пробелы из начала и конца строк
Полученные из пользовательского ввода строки зачастую содержат лишние пробелы. В одном из предыдущих примеров мы удаляли повторяющиеся пробелы между словами.
Взглянем на пробелы, расположенные вокруг строк, и удалим их. Класс std::string
std::string_view
Как это делается
В этом примере мы напишем вспомогательную функцию, которая определяет наличие пробелов в начале и конце строки и возвращает ее копию, но уже без таких пробелов. Затем немного протестируем ее.
1. Как и обычно, сначала идут заголовочные файлы и директива using
#include
#include
#include
#include
using namespace std;
2. Наша функция будет принимать константную ссылку на существующую строку. А возвращать станет новую строку, из начала и конца которой удалены лишние пробелы:
string trim_whitespace_surrounding(const string &s)
{