我有std :: string变量。我需要将未签名字符数组中的一些字节放入其中。我知道第一个字节和第一个字节。
我可以使用std :: string :: assign函数。我已经做到了。
但是我想使用memcpy函数以正确的方式解决该问题。
std::string newString;
memcpy(&newString, &bytes[startIndex], length);
我知道这是错误的。我已经研究并使用std :: vector找到了一些想法。
[请帮助我找到解决此问题的最佳方法。
由于我们只是构造字符串,所以有一个std::string
构造函数需要两个迭代器:
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]
† C ++ 11以前的版本在技术上不能保证将字符串连续存储在内存中,尽管实际上还是可以做到这一点。
您需要设置字符串的大小,以便将有适当大小的缓冲区来接收数据,并将常量从您从if (length > 0) // Avoids accessing oldString[0] if empty
{
oldString.resize(length); // make sure we have enough space!
memcpy(&oldString[0], &bytes[startIndex], length);
}
获得的指针中强制转换为常量
data()
当然,所有这些都是未定义行为的领域,但相当标准的行为却并非如此。
这是一个hack,正如您所说的那样,但是由于STL保证std::string newString;
newString.resize(length);
memcpy((char*)newString.data(), &bytes[startIndex], length);
具有连续的存储,所以有可能:
std::string
当然,您可以以相同的方式使用std::string str(32, '\0');
std::strcpy(const_cast<char*>(str.data()), "REALLY DUDE, IT'S ILLEGAL WAY");
(我仅使用std::memcpy
复制以空值结尾的字符串)...
根据您的情况:
strcpy