从 int8_t 数组创建 std::string

Posted

技术标签:

【中文标题】从 int8_t 数组创建 std::string【英文标题】:Create std::string from int8_t array 【发布时间】:2022-01-02 02:34:09 【问题描述】:

在某些代码中使用int8_t[] 类型而不是char[]

int8_t title[256] = 'a', 'e', 'w', 's';
std::string s(title); // compile error: no corresponding constructor

如何正确安全地创建std::string

当我执行cout << s; 时,我希望它打印aews,就好像char[] 类型已传递给构造函数一样。

【问题讨论】:

看到这个问题...***.com/questions/42961443/… 【参考方案1】:

std::string 像其他容器一样可以使用一对迭代器来构造。如果可用,此构造函数将使用隐式转换,例如将int8_t 转换为char

int8_t title[256] = 'a', 'e', 'w', 's';
std::string s(std::begin(title), std::end(title));

请注意,此解决方案将复制整个数组,包括未使用的字节。如果数组通常比需要的大得多,则可以寻找空终止符

int8_t title[256] = 'a', 'e', 'w', 's';
auto end = std::find(std::begin(title), std::end(title), '\0');
std::string s(std::begin(title), end);

【讨论】:

【参考方案2】:

你来了

int8_t title[256] =  'a', 'e', 'w', 's' ;
std::string s( reinterpret_cast<char *>( title ) );
std::cout << s << '\n';

或者你也可以使用

std::string s( reinterpret_cast<char *>( title ), 4 );

【讨论】:

如果数组中没有明确的空终止符,这听起来是个坏主意。 @dave 为什么你决定没有空终止字符? 该数组中应该有 252 个空终止符。 :-) @dave 我虽然同样的事情,然后记得所有缺少的初始化程序都设置为0,所以它有 252 个空终止符。 对了,没看到 256 的大小。在这种情况下没关系

以上是关于从 int8_t 数组创建 std::string的主要内容,如果未能解决你的问题,请参考以下文章

根据缓冲区长度将空终止字符数组复制到 std::string

从 char(不是 char*)到 std::string 的首选转换

由于缓存,为啥访问 int8_t 数组并不比 int32_t 快?

从输入迭代器创建 C++ std::string 的性能

如何正确删除 std::string 数组 [重复]

如何在进程C ++之间发送std :: string数组