【问题标题】:Convert std::wstring to WCHAR array将 std::wstring 转换为 WCHAR 数组
【发布时间】:2021-08-07 08:43:31
【问题描述】:

我已经在互联网上搜索了几天关于这个问题。我做了一个 win32 项目,我想在其中将 wstring 转换为 WCHAR 数组

请举个例子 如果您发现任何错误,请举例说明

wstring timeNow = L"Hello";
WCHAR timeWchar[6] = {(WCHAR)timeNow.c_str()}; // Not Working

当我运行我的程序时,我只看到一个正方形而不是文本

【问题讨论】:

  • 这能回答你的问题吗? How to convert wstring to wchar_t*? C++
  • WCHAR 数组是 6 大真的很重要吗?由于您正在创建一个数组,因此您需要将值复制到其中。您也可以这样使用const WCHAR *timeWchar = timeNow.c_str();,也可以使用带有const WCHAR [ ] 参数的函数,而无需复制。
  • 您的代码失败,因为强制转换告诉编译器一个谎言。指针不是 WCHAR。这就是编译器反对的原因,也是为什么强制转换允许代码编译但没有做任何有用的事情的原因。我的一个问题是你在用这个数组做什么?正如 JVApen 所说,也许您根本不需要数组,具体取决于使用它的代码实际在做什么。很遗憾,我们看不到这一点。
  • 我在下面留下了一个答案,显示了从字符串初始化数组的可能性。但是我突然想到,就像上面我最初没有阅读的 cmets 一样,可能根本不需要将字符串复制到数组中。 C++ 中有很多很棒的std:: 类,它们可能比将字符串复制到数组中来完成手头的任务要好。你能更多地了解你真正想做的事情吗?如果您有更多详细信息,我会修改我的答案。

标签: c++ winapi


【解决方案1】:

我假设WCHAR 是指wchar_t。

您可以遍历数组并分配元素。

或者,如果您不想自己编写循环,您可以使用标准库中的算法。示例:

assert(timeNow.size() < 6);
wchar_t timeWchar[6] {};
std::ranges::copy(timeNow, timeWchar);

【讨论】:

  • 是这个答案的第一句话,WCHAR 不只是 wchar_t 的别名吗?
  • @DavidHeffernan 这就是我的假设。但从技术上讲,它是一个非保留标识符,因此 OP 可以将其定义为任何类型的实体。
  • 但为什么是&lt; 6?应该是&lt; 7
  • @АлексейНеудачин but why &lt; 6? 因为更长的字符串在不被截断的情况下无法放入数组中(假设为空终止)。编辑:should be &lt; 7 那么空终止符就没有空间了。
  • L'\0' 没有大小。如果它最终是(你认为它在那里)
【解决方案2】:

你不能真正用指针初始化一个数组。

这更接近您想要的,而无需将字符串复制到数组中。只需使用指针来引用字符。

wstring timeNow = L"Hello";
const WCHAR* timeWchar = timeNow.c_str();

99% 的情况下,以上内容适用于您需要做的任何事情,前提是您不需要修改字符。

如果确实需要将字符复制到不同的数组中,例如当您需要操作字符串时,这在 Windows 中会很好 - 假设您有一个足够大的固定大小的数组收到副本。

wstring timeNow = L"Hello";
WCHAR timeWchar[6];
StringCchCopyW(timeWchar, ARRAYSIZE(timeWchar), timeNow.c_str());

如果你不提前知道长度,那么你需要在复制之前分配它:

size_t allocSize = timeNow.size() + 1;
WCHAR timeWchar = new WCHAR[allocSize];
StringCchCopyW(timeWchar, allocSize, timeNow.c_str());
/* don't forget to `delete [] timeWchar` when you are done */

但是当你可以让 C++ 为你完成工作时,为什么还要搞乱 new 和 delete 呢。制作字符串的副本,然后使用指针来引用副本中的字符。

wstring timeNowCopy = timeNow;
const WCHAR* timeWchar = timeNowCopy.c_str(); // timeWchar points to the array copied into timeNowCopy. 

如果你可以一起维护堆栈上的 timeNowCopy 和 timeWchar 的生命周期,那么你不需要显式地新建或删除任何东西。

【讨论】:

  • 如果有人出于某种原因使用数组,StringCchCopyW 无论如何都不会工作。因为有(或可能有)\0's
  • 我会选择memcpy( .., wstr.data(), wstr.size()*2)
  • @АлексейНеудачин - 你建议memcpy 是正确的,但这是一个例外情况,用户需要从字符串中保留空字符。我还怀疑 OP 只认为他需要一个数组。无论他认为他需要WCHAR 的数组来做什么,他都可以使用std::wstring 轻松完成。
  • 是的,他是。如果你真的需要数组。
  • 我怀疑如果 OP 是 C++ 新手并且不熟悉将字符串转换为数组,那么他可能无论如何都不需要这样做。我给 OP 留下了一条评论,解释了他真正想要完成的事情
【解决方案3】:

只要做到.data()。

WCHAR timeWchar[6] = ...

无论如何都不会工作

我想在其中将一个 wstring 转换为一个 WCHAR 数组

如果你的意思是wchar_t [6] 类型 - 你只是不需要这个。 您没有可以使用wchar_t [6] 但不能使用wstr.data() 的情况。

【讨论】:

  • *"您没有可以使用wchar_t [6] 但不能使用wstr.data() 的情况-这是不正确的。 wstr.data() 丢失了大小信息,该信息仍被捕获在数组中。
猜你喜欢
  • 1970-01-01
  • 2014-07-03
  • 2017-04-08
  • 2011-01-03
  • 2012-07-01
  • 1970-01-01
  • 2012-04-29
  • 2021-08-29
  • 1970-01-01
相关资源
最近更新 更多