Копирование не нуль-терминированного массива unsigned char в std::string
У меня возникла проблема с копированием массива unsigned char
, который не заканчивается на нулевой символ, в объект std::string
. Если бы массив был с нулевым окончанием, задача была бы довольно простой:
unsigned char u_array[4] = { 'a', 's', 'd', '\0' };
std::string str = reinterpret_cast<char*>(u_array);
std::cout << "-> " << str << std::endl;
Тем не менее, у меня есть массив, который не содержит нулевого символа, как в следующем примере:
unsigned char u_array[4] = { 'a', 's', 'd', 'f' };
Мне интересно, как лучше всего скопировать этот массив в std::string
. Есть ли способ сделать это без перебора элементов массива unsigned char
?
Спасибо всем за помощь!
5 ответ(ов)
Да, очевидно, что std::string имеет конструктор, который можно использовать в данном случае:
std::string str(reinterpret_cast<char*>(u_array), 4);
Этот конструктор принимает указатель на массив символов и длину, что позволяет создать строку из первых 4 байтов массива u_array
. Не забудьте убедиться, что массив действительно содержит достаточное количество данных, чтобы избежать неопределённого поведения.
При создании строки без указания её размера конструктор будет итерироваться по массиву символов и искать символ-терминатор (null-терминатор), который обозначается как '\0'
. Если этого символа нет, вам необходимо явно указать длину. Например:
// --*-- C++ --*--
#include <string>
#include <iostream>
int main() {
unsigned char u_array[4] = { 'a', 's', 'd', 'f' };
std::string str(reinterpret_cast<const char *>(u_array),
sizeof(u_array) / sizeof(u_array[0]));
std::cout << "-> " << str << std::endl;
}
В данном примере мы явно указываем длину массива u_array
при создании строки str
, что позволяет избежать проблем, связанных с отсутствием символа-терминатора.
Да, в классе std::string
есть метод с именем assign
. Вы можете использовать его для присвоения значений из char*
с указанием размера. Например:
#include <string>
int main() {
const char* cstr = "Hello, World!";
size_t size = 5; // например, длина строки, которую вы хотите присвоить
std::string str;
str.assign(cstr, size); // присвоение первых 5 символов из cstr
return 0;
}
В этом примере метод assign
принимает char*
и размер, после чего строка str
будет содержать только первые 5 символов "Hello". Для получения дополнительной информации вы можете ознакомиться с документацией.
Это должно сработать:
std::string s(u_array, u_array + sizeof(u_array) / sizeof(u_array[0]));
Данный код создает объект типа std::string
, используя диапазон элементов массива u_array
. Начало диапазона - это указатель на первый элемент массива, а конец - это указатель на элемент, следующий за последним элементом массива, который вычисляется с использованием размера массива.
Вы можете использовать этот конструктор std::string
:
string ( const char * s, size_t n );
Таким образом, в вашем примере это будет выглядеть так:
std::string str(u_array, 4);
Этот код создаёт объект std::string
, инициализируя его первыми четырьмя символами из u_array
. Убедитесь, что u_array
— это корректный указатель на символы (например, char*
или const char*
), чтобы избежать ошибок компиляции.
Преобразование 'ArrayList<String>' в 'String[]' в Java
Как узнать, содержится ли определенная строка в массиве на JavaScript/jQuery?
Самый быстрый способ дублирования массива в JavaScript: slice против цикла 'for'
Проверка содержимого строки в строке на C++
Как преобразовать строку Java в byte[]?