Урок №201. Создание, уничтожение и конвертация std::string

  Юрий  | 

  |

  Обновл. 15 Сен 2021  | 

 23617

 ǀ   4 

На этом уроке мы рассмотрим, как создаются объекты std::string в языке С++, а также создание строк из чисел (и наоборот).

Создание std::string

Строковые классы имеют ряд конструкторов и деструктор, которые можно использовать для создания строк. Мы рассмотрим каждый из них.

string::string()


   Конструктор по умолчанию, который создает пустую строку.

Например:

Результат:

 

string::string(const string& strString)

   Конструктор копирования, который создает новую строку путем копирования strString.

Например:

Результат:

What a string!

string::string(const string& strString, size_type unIndex)
string::string(const string& strString, size_type unIndex, size_type unLength)


   Конструкторы, которые создают новые строки, которые состоят из строки strString (начиная с индекса unIndex) и количества символов, указанных в unLength.

   Если компилятор встречает NULL, то копирование строки завершается, даже если unLength не был достигнут.

   Если unLength не был указан, то все символы, начиная с unIndex, будут использованы.

   Если unIndex больше, чем размер строки, то выбрасывается исключение out_of_range.

Например:

Результат:

t a string
a stri

string::string(const char *szCString)

   Конструктор, который создает новую строку из передаваемой строки C-style szCString вплоть до нуль-терминатора (но его не включает). Если размер результата превышает максимальную длину строки, то генерируется исключение length_error.

Предупреждение: szCString не должен быть NULL.

Например:

Результат:

What a string!

string::string(const char *szCString, size_type unLength)


   Конструктор, который создает новую строку из строки C-style szCString с количеством символов, указанных в unLength.

   Если размер результата превышает максимальную длину строки, то генерируется исключение length_error.

Предупреждение: Только для этого конструктора значение NULL не обрабатывается как объект, указывающий на завершение строки szCString! Это означает, что компилятор дойдет до конца строки (если это позволяет unLength), даже если встретит NULL.

Например:

Результат:

What a

string::string(size_type nNum, char chChar)

   Конструктор, который создает новую строку, инициализированную символом chChar и требуемым количеством вхождений этого символа (указывается в nNum).

   Если размер результата превышает максимальную длину строки, то генерируется исключение length_error.

Например:

Результат:

GGGGG

template string::string(InputIterator itBeg, InputIterator itEnd)

   Конструктор, который создает новую строку, инициализированную символами диапазона [itBeg, itEnd).

   Если размер результата превышает максимальную длину строки, то генерируется исключение length_error.

Здесь нет примера, так как вероятность того, что вы будете использовать этот конструктор, ничтожно мала.

string::~string()

   Деструктор, который уничтожает строку и освобождает память.

Примера нет, так как деструктор вызывается неявно.

Создание std::string из чисел

Одно заметное упущение в классе std::string — это отсутствие возможности создавать строки из чисел. Например:

Здесь мы получим ошибку неудачной конвертации значения типа int в std::basic_string. Самый простой способ конвертировать числа в строки — это задействовать класс std::ostringstream, который находится в заголовочном файле sstream. std::ostringstream уже настроен для приема разных входных данных: символов, чисел, строк и т.д. А с помощью std::istringstream можно выполнять обратную конвертацию — выводить строки (либо через оператор вывода >>, либо через функцию str()).

Например, создадим std::string из разных входных данных:

Результат:

5
7.8
B

Обратите внимание, здесь отсутствует проверка на ошибки. Может случиться так, что конвертация tX в std::string будет неудачной. В таком случае, хорошим вариантом было бы подключить генерацию исключения.

Конвертация std::string в числа

Аналогично вышеприведенному решению:

Результат:

4.5

Обратите внимание, наша вторая конвертация потерпела неудачу, и мы получили false.

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (99 оценок, среднее: 4,91 из 5)
Загрузка...

Комментариев: 4

  1. Vitalii:

    «Создание std::string из чисел
    Одно заметное упущение в классе std::string — это отсутствие возможности создавать строки из чисел. Например:

    Здесь мы получим ошибку неудачной конвертации значения типа int в std::basic_string. Самый простой способ конвертировать числа в строки — это задействовать класс std::ostringstream, который находится в заголовочном файле sstream. std::ostringstream уже настроен для приема разных входных данных: символов, чисел, строк и т.д. А с помощью std::istringstream можно выполнять обратную конвертацию — выводить строки (либо через оператор вывода >>, либо через функцию str()).»

    В этом примере это просто не верно сделано. Как правильно заметили в комментах к предыдузему уроку — std::to_string, std::to_wstring  — уже имеются.
    Соответственно

  2. Сергей:

    Сейчас пробую более глубоко разобраться с std::string.
    Использую библиотеку для работы с JSON форматами, то функция возвращает может вернуть std::string в таком виде:

    или

    Т.е. библиотека преобразовівает кириллицу.

    Ожидается ответ:

    Как такие конвертации выполнить? Есть какой-то стандартный функционал для этого?

  3. Steindvart:

    Самому разбираться и писать функции-утилиты это, конечно, хорошо. Но лучше использовать средства библиотеки.

    Для преобразования чисел в строку есть функция
    std::to_string
    (https://en.cppreference.com/w/cpp/string/basic_string/to_string).
    Для обратного преобразования строки в числа есть множество функций std::stoi, std::stof и так далее.

  4. kmish:

    Пример с template string::string(InputIterator itBeg, InputIterator itEnd):

    Результат:

    What a string!
    hat a strin

Добавить комментарий для Steindvart Отменить ответ

Ваш E-mail не будет опубликован. Обязательные поля помечены *