На этом уроке мы рассмотрим, как создаются объекты std::string в языке С++, а также создание строк из чисел (и наоборот).
Создание std::string
Строковые классы имеют ряд конструкторов и деструктор, которые можно использовать для создания строк. Мы рассмотрим каждый из них.
string::string()
Конструктор по умолчанию, который создает пустую строку.
Например:
1 2 3 4 5 6 7 8 9 10 |
#include <iostream> #include <string> int main() { std::string sSomething; std::cout << sSomething; return 0; } |
Результат:
string::string(const string& strString)
Конструктор копирования, который создает новую строку путем копирования strString
.
Например:
1 2 3 4 5 6 7 8 9 10 11 |
#include <iostream> #include <string> int main() { std::string sSomething("What a string!"); std::string sOutput(sSomething); std::cout << sOutput; return 0; } |
Результат:
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.
Например:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#include <iostream> #include <string> int main() { std::string sSomething("What a string!"); std::string sOutput(sSomething, 3); std::cout << sOutput<< std::endl; std::string sOutput2(sSomething, 5, 6); std::cout << sOutput2 << std::endl; return 0; } |
Результат:
t a string
a stri
string::string(const char *szCString)
Конструктор, который создает новую строку из передаваемой строки C-style szCString
вплоть до нуль-терминатора (но его не включает). Если размер результата превышает максимальную длину строки, то генерируется исключение length_error.
Предупреждение: szCString
не должен быть NULL
.
Например:
1 2 3 4 5 6 7 8 9 10 11 |
#include <iostream> #include <string> int main() { const char *szSomething("What a string!"); std::string sOutput(szSomething); std::cout << sOutput << std::endl; return 0; } |
Результат:
What a string!
string::string(const char *szCString, size_type unLength)
Конструктор, который создает новую строку из строки C-style szCString
с количеством символов, указанных в unLength
.
Если размер результата превышает максимальную длину строки, то генерируется исключение length_error.
Предупреждение: Только для этого конструктора значение NULL
не обрабатывается как объект, указывающий на завершение строки szCString
! Это означает, что компилятор дойдет до конца строки (если это позволяет unLength
), даже если встретит NULL
.
Например:
1 2 3 4 5 6 7 8 9 10 11 |
#include <iostream> #include <string> int main() { const char *szSomething("What a string!"); std::string sOutput(szSomething, 7); std::cout << sOutput << std::endl; return 0; } |
Результат:
What a
string::string(size_type nNum, char chChar)
Конструктор, который создает новую строку, инициализированную символом chChar
и требуемым количеством вхождений этого символа (указывается в nNum
).
Если размер результата превышает максимальную длину строки, то генерируется исключение length_error.
Например:
1 2 3 4 5 6 7 8 9 10 |
#include <iostream> #include <string> int main() { std::string sOutput(5, 'G'); std::cout << sOutput << std::endl; return 0; } |
Результат:
GGGGG
template string::string(InputIterator itBeg, InputIterator itEnd)
Конструктор, который создает новую строку, инициализированную символами диапазона [itBeg, itEnd)
.
Если размер результата превышает максимальную длину строки, то генерируется исключение length_error.
Здесь нет примера, так как вероятность того, что вы будете использовать этот конструктор, ничтожно мала.
string::~string()
Деструктор, который уничтожает строку и освобождает память.
Примера нет, так как деструктор вызывается неявно.
Создание std::string из чисел
Одно заметное упущение в классе std::string — это отсутствие возможности создавать строки из чисел. Например:
1 2 3 4 5 6 7 8 9 |
#include <iostream> #include <string> int main() { std::string sFive(5); return 0; } |
Здесь мы получим ошибку неудачной конвертации значения типа int в std::basic_string. Самый простой способ конвертировать числа в строки — это задействовать класс std::ostringstream, который находится в заголовочном файле sstream. std::ostringstream уже настроен для приема разных входных данных: символов, чисел, строк и т.д. А с помощью std::istringstream можно выполнять обратную конвертацию — выводить строки (либо через оператор вывода >>
, либо через функцию str()).
Например, создадим std::string из разных входных данных:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#include <iostream> #include <sstream> #include <string> template <typename T> inline std::string ToString(T tX) { std::ostringstream oStream; oStream << tX; return oStream.str(); } int main() { std::string sFive(ToString(5)); std::string sSevenPointEight(ToString(7.8)); std::string sB(ToString('B')); std::cout << sFive << std::endl; std::cout << sSevenPointEight << std::endl; std::cout << sB << std::endl; } |
Результат:
5
7.8
B
Обратите внимание, здесь отсутствует проверка на ошибки. Может случиться так, что конвертация tX
в std::string будет неудачной. В таком случае, хорошим вариантом было бы подключить генерацию исключения.
Конвертация std::string в числа
Аналогично вышеприведенному решению:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#include <iostream> #include <sstream> #include <string> template <typename T> inline bool FromString(const std::string& sString, T &tX) { std::istringstream iStream(sString); return (iStream >> tX) ? true : false; // извлекаем значение в tX, возвращаем true (если удачно) или false (если неудачно) } int main() { double dX; if (FromString("4.5", dX)) std::cout << dX << std::endl; if (FromString("TOM", dX)) std::cout << dX << std::endl; } |
Результат:
4.5
Обратите внимание, наша вторая конвертация потерпела неудачу, и мы получили false
.
Сейчас пробую более глубоко разобраться с std::string.
Использую библиотеку для работы с JSON форматами, то функция возвращает может вернуть std::string в таком виде:
или
Т.е. библиотека преобразовівает кириллицу.
Ожидается ответ:
Как такие конвертации выполнить? Есть какой-то стандартный функционал для этого?
Самому разбираться и писать функции-утилиты это, конечно, хорошо. Но лучше использовать средства библиотеки.
Для преобразования чисел в строку есть функция
std::to_string
(https://en.cppreference.com/w/cpp/string/basic_string/to_string).
Для обратного преобразования строки в числа есть множество функций std::stoi, std::stof и так далее.
Пример с template string::string(InputIterator itBeg, InputIterator itEnd):
Результат:
What a string!
hat a strin