Копирование беззнакового символа без знака 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?
Спасибо всем.
Ответы
Ответ 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);
Ответ 3
std::string имеет метод с именем assign. Вы можете использовать char * и размер.
http://www.cplusplus.com/reference/string/string/assign/
Ответ 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.