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

kar*_*lip 41 c++ arrays string copy null-terminated

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

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

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

unsigned char u_array[4] = { 'a', 's', 'd', 'f' };
Run Code Online (Sandbox Code Playgroud)

进入std::string.

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

谢谢你们.

CB *_*ley 52

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;
}
Run Code Online (Sandbox Code Playgroud)

当然,"数组大小"模板函数比sizeof计算更健壮.

  • 或者你可以简单地用`std :: end(u_array)`替换第二个参数(C++ 0x) (6认同)
  • 仅供参考,`sizeof u_char [0]`的除法完全是多余的.标准的*大小*保证*等于`char`的大小,根据定义为1. (5认同)
  • @Konrad:我相信Charles选择显示一般代码,以免误导读者只为`wchar_t`做一个`sizeof`. (5认同)
  • @Charles,停止使用错误的编译器。您需要调用的构造函数签名是std :: string(const char *,size_t),因为unsigned不会隐式转换为signed,传递unsigned char *会带来歧义。检查适当的编译器,或查看例如-http://stackoverflow.com/questions/804123/const-unsigned-char-to-stdstring (2认同)

kar*_*lip 18

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

std::string str(reinterpret_cast<char*>(u_array), 4);
Run Code Online (Sandbox Code Playgroud)

  • 更多的意识形态思想,但不丢弃数组的常量会更好.另外,采用它的大小而不是硬编码容易出错的"4". (2认同)

小智 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;
}
Run Code Online (Sandbox Code Playgroud)