Этот сайт использует cookies. Продолжение работы с сайтом означает, что Вы согласны!
Классы string и wstring
C-строки являются массивами, поэтому работать с такими строками не очень удобно. Например, нельзя присвоить строку в двойных кавычках после объявления строки:
char str1[] = "abc"; // Нормально
char str2[7];
str2 = "abc"; // Ошибка
Кроме того, нельзя увеличить размер строки после объявления или соединить две строки в одну с помощью операторов:
char str1[] = "abc", str2[7] = "def";
char str3[] = str1 + str2; // Ошибка
Класс string
предоставляет более удобный интерфейс доступа, который избавляет программиста от необходимости следить за размером символьного массива и предоставляет множество методов для обработки строки. При необходимости можно преобразовать объект класса string
в C-строку. Название класса string
является лишь псевдонимом шаблонного класса basic_string
:
template<typename _CharT, typename _Traits = char_traits<_CharT>,
typename _Alloc = allocator<_CharT> >
class basic_string;
typedef basic_string<char> string;
Класс wstring
предоставляет удобный интерфейс для работы с L-строками. Название класса wstring
является лишь псевдонимом шаблонного класса basic_string
:
typedef basic_string<wchar_t> wstring;
Классы string
и wstring
являются псевдонимами шаблонного класса basic_string
. Поэтому с объектами класса wstring
можно производить такие же операции, как и с объектами класса string
, а также использовать те же самые методы. Различие заключается в типах данных.
Для использования классов string
и wstring
необходимо подключить файл string
:
#include <string>
Объявление и инициализация строки
Создать объект строки можно следующими способами:
- объявить переменную без инициализации. Для этого перед названием переменной указывается название класса. Размер строки указывать не нужно. Пример:
std::string str;
std::wstring wstr;
std::cout << str.size() << std::endl; // 0
std::cout << wstr.size() << std::endl; // 0
- указать литерал строки внутри круглых скобок или после оператора
=
:
std::setlocale(LC_ALL, "Russian_Russia.1251");
std::string str1("строка1");
std::string str2 = "строка2";
std::cout << str1 << ' ' << str2 << std::endl;
// строка1 строка2
std::wstring wstr1(L"строка1");
std::wstring wstr2 = L"строка2";
std::wcout << wstr1 << ' ' << wstr2 << std::endl;
// строка1 строка2
Если во втором параметре передать число, то можно присвоить только часть строки, а не всю строку:
std::setlocale(LC_ALL, "Russian_Russia.1251");
std::string str("строка", 3);
std::cout << str << std::endl; // стр
std::wstring wstr(L"строка", 3);
std::wcout << wstr << std::endl; // стр
- указать объект строки внутри круглых скобок или после оператора
=
:
std::setlocale(LC_ALL, "Russian_Russia.1251");
std::string str1("строка");
std::string str2(str1);
std::string str3 = str1;
std::cout << str2 << std::endl; // строка
std::cout << str3 << std::endl; // строка
std::wstring wstr1(L"строка");
std::wstring wstr2(wstr1);
std::wstring wstr3 = wstr1;
std::wcout << wstr2 << std::endl; // строка
std::wcout << wstr3 << std::endl; // строка
Можно присвоить не все содержимое объекта, а его часть. Для этого во втором параметре следует передать начальный индекс, а в третьем параметре количество символов. Если количество символов не указано, то копируется фрагмент до конца строки. Пример:
std::setlocale(LC_ALL, "Russian_Russia.1251");
std::string str1("строка");
std::string str2(str1, 3);
std::string str3(str1, 1, 3);
std::cout << str2 << std::endl; // ока
std::cout << str3 << std::endl; // тро
std::wstring wstr1(L"строка");
std::wstring wstr2(wstr1, 3);
std::wstring wstr3(wstr1, 0, 3);
std::wcout << wstr2 << std::endl; // ока
std::wcout << wstr3 << std::endl; // стр
- задать диапазон с помощью двух итераторов:
std::setlocale(LC_ALL, "Russian_Russia.1251");
std::string str1("строка");
std::string str2(str1.begin(), str1.end());
std::cout << str2 << std::endl; // строка
std::wstring wstr1(L"строка");
std::wstring wstr2(wstr1.begin(), wstr1.begin() + 3);
std::wcout << wstr2 << std::endl; // стр
- указать в первом параметре количество символов, а во втором параметре символ-заполнитель:
std::setlocale(LC_ALL, "Russian_Russia.1251");
std::string str(5, '*');
std::cout << str << std::endl; // *****
std::wstring wstr(5, L'ф');
std::wcout << wstr << std::endl; // ффффф
- перечислить символы через запятую внутри фигурных скобок:
std::setlocale(LC_ALL, "Russian_Russia.1251");
std::string str {'с', 'т', 'р', 'о', 'к', 'а'};
std::cout << str << std::endl; // строка
std::wstring wstr {L'с', L'т', L'р', L'о', L'к', L'а'};
std::wcout << wstr << std::endl; // строка
Создать строку в кодировке UTF-8 можно, например, так:
std::string str_utf8(u8"строка");
for (char &ch : str_utf8) {
std::cout << (int)ch << ' ';
} // -47 -127 -47 -126 -47 -128 -48 -66 -48 -70 -48 -80
std::cout << std::endl;
Присвоить значение переменной уже после объявления можно с помощью оператора =
. Следить за размером строки не нужно. Если производится присваивание объекта классов string
или wstring
, то создается копия исходного объекта, а не присваивается ссылка на него. Пример:
std::string str1, str2, str3, str4;
str1 = "string"; // Присваивание C-строки
str1 = "new string"; // Следить за размером строки не нужно
str2 = str1; // Присваивание объекта класса string
str3 = 'я'; // Присваивание символа
// Присваивание нескольких символов
str4 = {'с', 'т', 'р', 'о', 'к', 'а'};
std::cout << str1 << std::endl; // new string
std::cout << str2 << std::endl; // new string
std::cout << str3 << std::endl; // я
std::cout << str4 << std::endl; // строка
Вместо оператора =
для присваивания значения можно воспользоваться методом assign()
. Название метода указывается после имени переменной через точку. Прототипы метода:
basic_string &assign(const _CharT *str);
basic_string &assign(const _CharT *str, size_type count);
basic_string &assign(const basic_string &str);
basic_string &assign(const basic_string &str, size_type pos,
size_type count);
basic_string &assign(size_type count, _CharT ch);
template<class _InputIterator>
basic_string &assign(_InputIterator first, _InputIterator last);
basic_string &assign(initializer_list<_CharT> list);
Первый прототип позволяет присвоить строку целиком, а второй прототип — только count
первых символов из строки str
:
std::setlocale(LC_ALL, "Russian_Russia.1251");
std::string str1, str2;
str1.assign("строка");
std::cout << str1 << std::endl; // строка
str2.assign("строка", 3);
std::cout << str2 << std::endl; // стр
std::wstring wstr;
wstr.assign(L"строка");
std::wcout << wstr << std::endl; // строка
Третий прототип позволяет присвоить объект строки целиком, а четвертый прототип — только count
символов, начиная с индекса pos
:
std::string str1, str2("строка");
str1.assign(str2);
std::cout << str1 << std::endl; // строка
str1.assign(str2, 0, 3);
std::cout << str1 << std::endl; // стр
Пятый прототип присваивает count
символов ch
:
std::string str;
str.assign(5, '*');
std::cout << str << std::endl; // *****
Шестой прототип позволяет указать начальную first
и конечную last
позицию с помощью итераторов:
std::string str1, str2("строка");
str1.assign(str2.begin(), str2.end());
std::cout << str1 << std::endl; // строка
str1.assign(str2.begin(), str2.begin() + 3);
std::cout << str1 << std::endl; // стр
Седьмой прототип создает строку из символов внутри списка инициализации:
std::string str;
std::initializer_list<char> list = {'с', 'т', 'р', 'о', 'к', 'а'};
str.assign(list);
std::cout << str << std::endl; // строка
Реквизиты
ЮMoney (Yandex-деньги): 410011140483022
ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов