将非null终止的unsigned char数组复制到std :: string

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将非null终止的unsigned char数组复制到std :: string相关的知识,希望对你有一定的参考价值。

如果数组是以null结尾的,那么这将非常简单:

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

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

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

进入std::string

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

谢谢你们。

答案

std::string有一个constructor,它带有一对迭代器,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计算更稳健。

另一答案

呃,演员为什么?

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

完成。

另一答案

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

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.

另一答案

虽然问题是如何“将非空终止的unsigned char数组[...]复制到std::string”,但我注意到在给定的例子中,字符串仅用作std::cout的输入。

在这种情况下,当然你可以完全避免字符串而只是这样做

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

我认为可以解决OP试图解决的问题。

另一答案

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

std::string str(reinterpret_cast<char*>(u_array), 4);
另一答案

在构造字符串而不指定其大小时,构造函数将迭代一个字符数组并查找null-terminator,即''字符。如果您没有该字符,则必须明确指定长度,例如:

// --*-- 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;
}
另一答案

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

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

另一答案

你可以使用这个std::string构造函数:

string ( const char * s, size_t n );

所以在你的例子中:

std::string str(u_array, 4);
另一答案

这应该这样做:

std::string s(u_array, u_array+sizeof(u_array)/sizeof(u_array[0]));
另一答案

您可以创建指向第一个字符的字符指针,另一个指向最后一个字符,并使用这两个指针作为迭代器进行构造。从而:

std::string str(&u_array[0], &u_array[0] + 4);
另一答案

尝试:

std::string str;
str.resize(4);
std::copy(u_array, u_array+4, str.begin());
另一答案

std :: string有一个构造函数,它接受一个char数组和一个length。

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

以上是关于将非null终止的unsigned char数组复制到std :: string的主要内容,如果未能解决你的问题,请参考以下文章

C: unsigned char * bytes 数组将元素复制到其他 unsigned char * 数组

unsigned char 到 8 个原始位的 unsigned char 数组

ARDUINO 中将一个unsigned char 的数组的数据转化为一个long 型的数

C语言中的unsigned char数组怎么转成unsigned short数组

在 C 中读取和写入 unsigned char 的缓冲区到文件?

C - unsigned int 到 unsigned char 数组转换