46

如果数组是空终止的,这将非常简单:

unsigned char u_array[4] = { 'a', 's', 'd', '\0' };
std::string str = reinterpret_cast<char*>(u_array);
std::cout << "-> " << str << std::endl;

但是,我想知道复制非空终止unsigned char 数组的最合适方法是什么,如下所示:

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

变成一个std::string.

有没有办法在不迭代unsigned char 数组的情况下做到这一点?

谢谢你们。

4

12 回答 12

62

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计算更健壮。

于 2011-01-14T13:49:56.050 回答
26

好吧,显然std::string有一个可以在这种情况下使用的构造函数:

std::string str(reinterpret_cast<char*>(u_array), 4);
于 2011-01-14T13:45:06.150 回答
6

当构造一个未指定大小的字符串时,构造函数将遍历一个字符数组并查找空终止符,即'\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;
}
于 2011-01-14T13:47:54.053 回答
4

这应该这样做:

std::string s(u_array, u_array+sizeof(u_array)/sizeof(u_array[0]));
于 2011-01-14T13:47:39.760 回答
3

std::string 有一个名为 assign 的方法。您可以使用 char * 和大小。

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

于 2011-01-14T13:45:04.677 回答
2

您可以使用此std::string构造函数:

string ( const char * s, size_t n );

所以在你的例子中:

std::string str(u_array, 4);
于 2011-01-14T13:47:01.867 回答
1

您可以创建一个指向第一个字符的字符指针,和另一个指向过去一个字符的字符指针,并使用这两个指针作为迭代器进行构造。因此:

std::string str(&u_array[0], &u_array[0] + 4);
于 2011-01-14T13:45:09.900 回答
1

当字符串本身包含空字符并且您尝试随后打印字符串时仍然存在问题:

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 时,它就是这样的时代。

于 2012-02-03T15:17:38.697 回答
0

尝试:

std::string str;
str.resize(4);
std::copy(u_array, u_array+4, str.begin());
于 2011-01-14T13:46:29.847 回答
0

std::string 有一个构造函数,它采用一个 char 数组和一个长度。

unsigned char u_array[4] = { 'a', 's', 'd', 'f' };
std::string str(reinterpret_cast<char*>(u_array), sizeo(u_array));
于 2011-01-14T13:49:02.257 回答
0

呃,为什么是演员?

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

完毕。

于 2011-01-14T16:31:16.413 回答
0

尽管问题是如何“将非空终止unsigned char数组 [...] 复制到一个std::string”中,但我注意到在给定的示例中,该字符串仅用作std::cout.

在这种情况下,您当然可以完全避免使用该字符串而只需执行

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

我认为这可能会解决 OP试图解决的问题。

于 2018-09-08T06:34:57.983 回答