0

Копирование не нуль-терминированного массива unsigned char в std::string

6

У меня возникла проблема с копированием массива 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 ответ(ов)

0

Да, очевидно, что std::string имеет конструктор, который можно использовать в данном случае:

std::string str(reinterpret_cast<char*>(u_array), 4);

Этот конструктор принимает указатель на массив символов и длину, что позволяет создать строку из первых 4 байтов массива u_array. Не забудьте убедиться, что массив действительно содержит достаточное количество данных, чтобы избежать неопределённого поведения.

0

При создании строки без указания её размера конструктор будет итерироваться по массиву символов и искать символ-терминатор (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, что позволяет избежать проблем, связанных с отсутствием символа-терминатора.

0

Да, в классе 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". Для получения дополнительной информации вы можете ознакомиться с документацией.

0

Это должно сработать:

std::string s(u_array, u_array + sizeof(u_array) / sizeof(u_array[0]));

Данный код создает объект типа std::string, используя диапазон элементов массива u_array. Начало диапазона - это указатель на первый элемент массива, а конец - это указатель на элемент, следующий за последним элементом массива, который вычисляется с использованием размера массива.

0

Вы можете использовать этот конструктор std::string:

string ( const char * s, size_t n );

Таким образом, в вашем примере это будет выглядеть так:

std::string str(u_array, 4);

Этот код создаёт объект std::string, инициализируя его первыми четырьмя символами из u_array. Убедитесь, что u_array — это корректный указатель на символы (например, char* или const char*), чтобы избежать ошибок компиляции.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь