如果数组以null结尾,这将非常简单:
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数组,有没有办法做到这一点?
谢谢大家。
答案 0 :(得分:46)
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
计算更强大。
答案 1 :(得分:16)
嗯,显然 std :: string 有一个构造函数可以在这种情况下使用:
std::string str(reinterpret_cast<char*>(u_array), 4);
答案 2 :(得分:5)
在构造字符串时没有指定其大小,构造函数将迭代一个字符数组并查找null-terminator,即'\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;
}
答案 3 :(得分:3)
std :: string有一个名为assign的方法。您可以使用char *和大小。
答案 4 :(得分:2)
您可以使用此std::string
构造函数:
string ( const char * s, size_t n );
所以在你的例子中:
std::string str(u_array, 4);
答案 5 :(得分:2)
这应该这样做:
std::string s(u_array, u_array+sizeof(u_array)/sizeof(u_array[0]));
答案 6 :(得分:0)
您可以创建指向第一个字符的字符指针,另一个指向最后一个字符,并使用这两个指针作为迭代器进行构造。因此:
std::string str(&u_array[0], &u_array[0] + 4);
答案 7 :(得分:0)
尝试:
std::string str;
str.resize(4);
std::copy(u_array, u_array+4, str.begin());
答案 8 :(得分:0)
std :: string有一个构造函数,它接受一个char数组和一个长度。
unsigned char u_array[4] = { 'a', 's', 'd', 'f' };
std::string str(reinterpret_cast<char*>(u_array), sizeo(u_array));
答案 9 :(得分:0)
呃,演员为什么?
std::string str(u_array, u_array + sizeof(u_array));
完成。
答案 10 :(得分:0)
当字符串本身包含空字符并且您尝试随后打印字符串时仍然存在问题:
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时,就像这样。
答案 11 :(得分:0)
尽管问题是如何“将非空终止的unsigned char
数组[...]复制到std::string
”,但我注意到在给定的示例中,字符串仅用作输入std::cout
。
在这种情况下,您当然可以完全避免使用字符串,而只需
std::cout.write(u_array, sizeof u_array);
std::cout << std::endl;
我认为可以解决OP正在尝试解决的问题。