Подтвердить что ты не робот

Копирование беззнакового символа без знака 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;

Однако интересно, какой наиболее подходящий способ скопировать массив без нулевого завершения без знака char, например:

unsigned char u_array[4] = { 'a', 's', 'd', 'f' };

в a std::string.

Есть ли способ сделать это без повторения беззнакового массива char?

Спасибо всем.

4b9b3361

Ответ 1

std::string имеет конструктор , который берет пару итераторов, а unsigned char может быть преобразован (в порядке реализации) в char так это работает. Нет необходимости в reinterpret_cast.

unsigned char u_array[4] = { 'a', 's', 'd', 'f' };

#include <string>
#include <iostream>
#include <ostream>

int main()
{
    std::string str( u_array, u_array + sizeof u_array / sizeof u_array[0] );
    std::cout << str << std::endl;
    return 0;
}

Конечно, функция шаблона "размер массива" более надежна, чем вычисление sizeof.

Ответ 2

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

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

Ответ 4

При построении строки без указания ее размера конструктор будет перебирать массив символов и искать нуль-терминатор, который является символом '\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;
}

Ответ 5

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

string ( const char * s, size_t n );

поэтому в вашем примере:

std::string str(u_array, 4);

Ответ 6

Это должно сделать это:

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

Ответ 7

Вы можете создать указатель на символ, указывающий на первый символ, а другой - на один за прошлым и построить с помощью этих двух указателей в качестве итераторов. Таким образом:

std::string str(&u_array[0], &u_array[0] + 4);

Ответ 8

Try:

std::string str;
str.resize(4);
std::copy(u_array, u_array+4, str.begin());

Ответ 9

std::string имеет конструктор с массивом char и длиной.

unsigned char u_array[4] = { 'a', 's', 'd', 'f' };
std::string str(reinterpret_cast<char*>(u_array), sizeo(u_array));

Ответ 10

Ew, почему актеры?

 std::string str(u_array, u_array + sizeof(u_array));

Готово.

Ответ 11

По-прежнему существует проблема, когда сама строка содержит нулевой символ, и вы пытаетесь впоследствии распечатать строку:

char c_array[4] = { 'a', 's', 'd', 0 };

std::string toto(array,4);
cout << toto << endl;  //outputs a 3 chars and a NULL char

Однако....

cout << toto.c_str() << endl; //will only print 3 chars.

Свои времена, подобные этим, когда вы просто хотите расколоть кутикулу и использовать голый C.