Копирование массива без знака с нулевым символом в конце в std :: string - PullRequest
41 голосов
/ 14 января 2011

Если бы массив был с нулевым символом в конце , это было бы довольно просто:

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.

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

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

Ответы [ 12 ]

48 голосов
/ 14 января 2011

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.

17 голосов
/ 14 января 2011

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

std::string str(reinterpret_cast<char*>(u_array), 4);
6 голосов
/ 14 января 2011

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

std :: string имеет метод с именем assign. Вы можете использовать символ * и размер.

http://www.cplusplus.com/reference/string/string/assign/

2 голосов
/ 14 января 2011

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

std::string s(u_array, u_array+sizeof(u_array)/sizeof(u_array[0]));
2 голосов
/ 14 января 2011

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

string ( const char * s, size_t n );

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

std::string str(u_array, 4);
1 голос
/ 03 февраля 2012

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

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.

0 голосов
/ 08 сентября 2018

Хотя вопрос заключался в том, как «скопировать массив unsigned char с нулевым символом в конце [...] в std::string», я отмечаю, что в данном примере эта строка используется только как входная информация для std::cout.

В этом случае, конечно, вы можете полностью избежать строки и просто выполните

std::cout.write(u_array, sizeof u_array);
std::cout << std::endl;

, который, я думаю, может решить проблему, которую ОП пытался решить .

0 голосов
/ 14 января 2011

Фу, почему актерский состав?

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

Готово.

0 голосов
/ 14 января 2011

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

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