将变量wstring分配给C ++中的Char数组

时间:2018-10-23 15:31:07

标签: c++ vector char

我的char数组如下:

TCHAR name[256] = L"abc";

我还有另一个wstring矢量,如下,

std::vector<std::wstring> nameList;
nameList.push_back(L"cde");
nameList.push_back(L"fgh");

我想将 nameList 矢量第一个元素分配给 name 数组,

有人可以帮我吗?

2 个答案:

答案 0 :(得分:2)

您可以使用std::copy; name是一个有界的数组,但是它作为函数参数的用法会衰减到指向其第一个元素的指针,这满足了输出迭代器的要求。

因此您可以:

wchar_t name[256] = L"abc";

std::vector<std::wstring> nameList;
nameList.push_back(L"cde");
nameList.push_back(L"fgh");

std::copy(nameList.front().begin(), nameList.front().end(), name);

请注意:这不会在缓冲区中添加任何尾随\0终止符;如果您想替换/覆盖name,也应该只使用std::wstring并为自己节省一些麻烦

答案 1 :(得分:1)

考虑到您的问题以及必须使用数组而不是wstring的假设,您最好的选择是使用ITEM_PIPELINES = { 'myproject.pipelines.RootImagesPipeline': 1000 } 甚至是老式的std::copy。但是,由于以下两个原因,它们很危险:

  1. 如果TCHAR实际上不是wchar_t,则可能存在内存错误。
  2. 如果nameList包含的字符串长于255个TCHAR字符,则将导致缓冲区溢出。

也就是说,您可以使用以下命令安全地执行此操作:

memcpy

如果TCHAR不是wchar_t,您还可以添加if (nameList[0].size() >= 256) { throw std::length_error("string too long"); } std::copy(nameList[0].begin(), nameList[0].end(), name); name[nameList[0].size()] = TCHAR(0); 来强制编译器错误,但是由于副本将逐字符进行隐式转换,因此可能没有必要。