【问题标题】:Assign variable wstring to Char array in C++在 C++ 中将变量 wstring 分配给 Char 数组
【发布时间】:2018-10-23 15:31:07
【问题描述】:

我有如下的char数组:

TCHAR name[256] = L"abc";

我还有另外一个 wstring 向量如下,

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

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

谁能帮帮我?

【问题讨论】:

  • char name[256] = L"abc"; 应该是wchar_t ...
  • 或者为什么不std::wstring name;?然后你应该可以分配name = nameList[0];
  • 更新了添加 TCHAR 的问题。我想根据现有实现使用 TCHAR 数组。

标签: c++ vector char


【解决方案1】:

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

所以你可以:

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,省去一些麻烦

【讨论】:

  • 您有什么想法可以在不更改类型的情况下将尾随 \0 终止符添加到此缓冲区吗?这个可以吗?名称[nameList.front().length()] = '\0';
  • 是的……请注意,这个和我的回答假设缓冲区 name 足够大
【解决方案2】:

鉴于您的问题以及您必须使用数组而不是 wstring 的假设,您最好的选择可能是使用 std::copy 甚至是老式的 memcpy。然而,由于以下两个原因,这些都是危险的:

  1. 如果 TCHAR 实际上不是 wchar_t,则可能存在内存错误。
  2. 如果 nameList 包含一个长度超过 255 个 TCHAR 字符的字符串,则会出现缓冲区溢出。

也就是说,您可以通过以下方式安全地执行此操作:

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);

如果 TCHAR 不是 wchar_t,您还可以添加 static_assert 以强制编译器错误,但这可能不是必需的,因为副本会逐个字符地执行任何隐式转换。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    • 2014-12-14
    相关资源
    最近更新 更多