Создайте строку std::из массива int8_t

0

Вопрос

В каком-то коде int8_t[] тип используется вместо char[].

int8_t title[256] = {'a', 'e', 'w', 's'};
std::string s(title); // compile error: no corresponding constructor

Как правильно и безопасно создать std::string от этого?

Когда я это сделаю cout << s; Я хочу, чтобы это напечатали aews, как будто char[] тип был передан конструктору.

c++ casting char integer
2021-11-23 15:34:12
2

Лучший ответ

2

Вот ты где

int8_t title[256] = { 'a', 'e', 'w', 's' };
std::string s( reinterpret_cast<char *>( title ) );
std::cout << s << '\n';

Или вы можете использовать также

std::string s( reinterpret_cast<char *>( title ), 4 );
2021-11-23 15:45:55

Звучит как плохая идея без явного нулевого терминатора в массиве.
dave

@dave И почему вы решили, что нет нулевого завершающего символа?
Vlad from Moscow

В этом массиве должно быть 252 нулевых терминатора. :-)
Ted Lyngmo

@dave я подумал то же самое, а затем вспомнил, что все отсутствующие инициализаторы установлены на 0, так что в нем 252 нулевых терминатора.
NathanOliver

Ах да, не видел 256-го размера. Тогда в этом случае все в порядке
dave
1

std::string как и другие контейнеры, они могут быть построены с использованием пары итераторов. Этот конструктор будет использовать неявные преобразования, если они доступны, такие как преобразование int8_t Для char.

int8_t title[256] = {'a', 'e', 'w', 's'};
std::string s(std::begin(title), std::end(title));

Обратите внимание, что это решение скопирует весь массив, включая неиспользуемые байты. Если массив часто намного больше, чем нужно, вы можете вместо этого искать нулевой терминатор

int8_t title[256] = {'a', 'e', 'w', 's'};
auto end = std::find(std::begin(title), std::end(title), '\0');
std::string s(std::begin(title), end);
2021-11-23 15:38:17

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................