Преобразование объекта в C-строку или в массив символов

Для преобразования объекта строки в другой тип предназначены следующие методы:

  • c_str() — возвращает указатель типа const _CharT*. Его можно использовать в тех случаях, когда необходимо передать C-строку или L-строку (например, в функцию) вместо объекта строки. Изменять такую строку нельзя. Кроме того, следует учитывать, что после изменения объекта указатель может стать некорректным, поэтому предварительно нужно обновить значение указателя. Прототип метода:
const _CharT *c_str() const noexcept;

Пример преобразования объекта в C-строку и L-строку:

std::setlocale(LC_ALL, "Russian_Russia.1251");
std::string str1("строка");
char str2[80] = {0};
strcpy_s(str2, 80, str1.c_str());
std::cout << str2 << std::endl;     // строка
std::wstring wstr1(L"строка");
wchar_t wstr2[80] = {0};
wcscpy_s(wstr2, 80, wstr1.c_str());
std::wcout << wstr2 << std::endl;   // строка
  • data() — начиная со стандарта C++11, является синонимом метода c_str(), т. е. возвращает указатель на C-строку, заканчивающуюся нулевым символом. В предыдущих стандартах метод data() возвращал указатель на массив символов без нулевого символа. Прототип метода:
const char *data() const noexcept;

Пример:

std::setlocale(LC_ALL, "Russian_Russia.1251");
std::string str("строка");
const char *p = nullptr;
p = str.data();
std::cout << p[0] << std::endl; // с
std::cout << p[5] << std::endl; // а
std::cout << p << std::endl;    // строка

Начиная со стандарта C++17, можно изменять символы через возвращаемый методом data() указатель. Прототип метода:

_CharT *data() noexcept;

Пример:

// -std=c++17
std::setlocale(LC_ALL, "Russian_Russia.1251");
std::string str("строка");
char *p = str.data();
p[0] = 'С';
p[5] = 'А';
std::cout << p[0] << std::endl; // С
std::cout << p[5] << std::endl; // А
std::cout << p << std::endl;    // СтрокА
std::cout << str << std::endl;  // СтрокА
  • copy() — копирует count символов, начиная с индекса pos, в символьный массив buf. Если индекс не указан, то символы копируются с начала строки. Обратите внимание: нулевой символ автоматически не добавляется! В качестве значения метод возвращает количество скопированных символов. Прототип метода:
size_type copy(_CharT *buf, size_type count,
               size_type pos=0) const;

Пример:

std::setlocale(LC_ALL, "Russian_Russia.1251");
std::string str1("строка");
char str2[20] = {0}, str3[20] = {0};
std::string::size_type count;
count = str1.copy(str2, 5);
std::cout << count << std::endl; // 5
str2[count] = '\0';
std::cout << str2 << std::endl;  // строк
count = str1.copy(str3, 3, 1);
str3[count] = '\0';
std::cout << str3 << std::endl;  // тро

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов