На этом уроке мы рассмотрим способы доступа к символам std::string и способы конвертации std::string в строки C-style.
Доступ к символам std::string
Есть два практически идентичных способа доступа к символам std::string. Наиболее простой и быстрый — использовать перегруженный оператор индексации [].
char& string::operator[](size_type nIndex)
const char& string::operator[](size_type nIndex) const
Обе эти функции возвращают символ под индексом nIndex
.
Передача неверного индекса приведет к неопределенным результатам.
Использование функции length() в качестве индекса допустимо только для константных строк и возвращает значение, сгенерированное конструктором по умолчанию std::string. Это не рекомендуется делать.
Поскольку char&
— это тип возврата, то вы можете использовать его для изменения символов строки.
Например:
1 2 3 4 5 6 7 8 9 10 |
#include <iostream> #include <string> int main() { std::string sSomething("abcdefg"); std::cout << sSomething[4] << std::endl; sSomething[4] = 'A'; std::cout << sSomething << std::endl; } |
Результат:
e
abcdAfg
Другой способ доступа к символам std::string медленнее, чем вышеприведенный вариант, так как использует исключения для проверки корректности nIndex
. Если вы не уверены в корректности передаваемого nIndex
, то вы должны использовать именно этот способ (тот, что описан ниже) для доступа к символам строки.
char& string::at(size_type nIndex)
const char& string::at(size_type nIndex) const
Обе эти функции возвращают символ под индексом nIndex
.
Передача неверного индекса приведет к генерации исключения out_of_range.
Поскольку char&
— это тип возврата, то вы можете использовать его для изменения символов строки.
Например:
1 2 3 4 5 6 7 8 9 10 |
#include <iostream> #include <string> int main() { std::string sSomething("abcdefg"); std::cout << sSomething.at(4) << std::endl; sSomething.at(4) = 'A'; std::cout << sSomething << std::endl; } |
Результат:
Конвертация std::string в строки C-style
Многие функции (включая все функции языка C++) ожидают форматирования строк как строк C-style, а не как std::string. По этой причине std::string предоставляет 3 разных способа конвертации std::string в строки C-style.
const char* string::c_str() const
Возвращает содержимое std::string в виде константной строки C-style.
Добавляется нуль-терминатор.
Строка C-style принадлежит std::string и не должна быть удалена.
Например:
1 2 3 4 5 6 7 8 |
#include <iostream> #include <string> int main() { std::string sSomething("abcdefg"); std::cout << strlen(sSomething.c_str()); } |
Результат:
7
const char* string::data() const
Возвращает содержимое std::string в виде константной строки C-style.
Не добавляется нуль-терминатор.
Строка C-style принадлежит std::string и не должна быть удалена.
Например:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#include <iostream> #include <string> int main() { std::string sSomething("abcdefg"); const char *szString = "abcdefg"; // Функция memcmp() сравнивает две вышеприведенные строки C-style и возвращает 0, если они равны if (memcmp(sSomething.data(), szString, sSomething.length()) == 0) std::cout << "The strings are equal"; else std::cout << "The strings are not equal"; } |
Результат:
The strings are equal
size_type string::copy(char *szBuf, size_type nLength) const
size_type string::copy(char *szBuf, size_type nLength, size_type nIndex) const
Отличие второго варианта этой функции от первого состоит в том, что копирование не более nLength
символов передаваемой строки в szBuf
начинается с символа под индексом nIndex
. В первой же функции копирование всегда начинается с символа под индексом [0]
.
Количество скопированных символов возвращается.
Caller отвечает за то, чтобы не произошло переполнения строки szBuf
.
Например:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#include <iostream> #include <string> int main() { std::string sSomething("lorem ipsum dolor sit amet"); char szBuf[20]; int nLength = sSomething.copy(szBuf, 5, 6); szBuf[nLength] = '\0'; // завершаем строку в буфере std::cout << szBuf << std::endl; } |
Результат:
ipsum
Если вы не гонитесь за максимальной эффективностью, то c_str() — это самый простой и безопасный способ конвертации std::string в строки C-style.
в крайнем примере не помешает
Только в Visual Studio