2015-09-25 349 views
5

我有std :: string变量。我需要从无符号字符数组中放入一些字节。我知道第一个字节和第一个字母。使用memcpy()函数将unsigned char数组中的字节转换为std :: string

我可以使用std :: string :: assign函数。我已经完成了。

但我想用正确的方式使用memcpy函数解决该问题。

std::string newString; 
memcpy(&newString, &bytes[startIndex], length); 

我知道这是错误的。我研究并发现了一些使用std :: vector的想法。

请帮我找到这个问题最优雅的解决方案。

+4

为什么你认为'assign()'不是“正确的方式”? – Barry

+0

“以正确的方式”是“我知道这是错误的”=? – crashmstr

+0

@Barry我想用两种不同的方式来解决它。我正在学习C++语言。找到这个解决方案对我来说很有趣:) –

回答

11

因为我们只是构建STRI NG,有一个std::string构造函数两个迭代器:

template< class InputIt > 
basic_string(InputIt first, InputIt last, 
       const Allocator& alloc = Allocator()); 

,我们可以提供:

std::string newString(&bytes[startIndex], &bytes[startIndex] + length); 

如果我们没有构建字符串,而是被分配到一个现有的,你应该仍然倾向于使用assign()。这正是该功能是什么:

oldString.assign(&bytes[startIndex], &bytes[startIndex] + length); 

但如果你真的坚持memcpy()出于某种原因,那么你需要确保该字符串实际上已经被复制到足够的数据。然后用&str[0]作为目的地址&dagger复制到它;

oldString.resize(length); // make sure we have enough space! 
memcpy(&oldString[0], &bytes[startIndex], length); 

&匕首; Pre-C++ 11在技术上不能保证字符串连续存储在内存中,尽管实际上这是完成的。

+1

为什么downvote? – Barry

+0

IDK。看起来像有人不喜欢任何答案 – NathanOliver

+0

我认为'&字节[startIndex +长度]'会更符合你的(没有程序员执行指针算术)。但也有字符串ctor采用'const char *'和长度:'std :: string newString(&bytes [startIndex],length);' –

-1

您需要设置该字符串的大小,这样会有一个适当大小的缓冲区来接收数据,并投常量性出指针你从data()

std::string newString; 
newString.resize(length); 
memcpy((char*)newString.data(), &bytes[startIndex], length); 

当然,所有的这是在未定义的行为领域,但相当标准的不多。

+0

进入'&newString'? – Barry

+0

你说得对,固定 – shoosh

-3

这是一个黑客,像你说的错误的方式,但它是可能的,因为STL保证std::string具有连续的存储:

std::string str(32, '\0'); 
std::strcpy(const_cast<char*>(str.data()), "REALLY DUDE, IT'S ILLEGAL WAY"); 

当然,你也可以用同样的方式使用std::memcpy(我以前strcpy只是复制空值终止字符串)...

你的情况:

str.resize(length); 
memcpy(const_cast<char*>(str.data()), bytes + startIndex, length); 
+0

如果你正在复制的字符串有超过32个字节? – Barry

+0

当然,你应该'预先'适当的字符串(注意,'调整大小()'不''保留()'!) – Nevermore

+2

澄清什么Nevermore意思是“非法的方式”:[*修改通过数据访问的字符数组是未定义的行为*](http://en.cppreference.com/w/cpp/string/basic_string/data)。不要这样做'从STL保证std :: string有连续存储'这个 –

相关问题