You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将std::wstring转换为WCHAR数组?附错误场景与实现示例

错误原因
  • 现有代码的核心问题是把std::wstring::c_str()返回的指向宽字符串首地址的指针,直接强制转换成了WCHAR字符类型存入数组。相当于把内存地址值当成了第一个字符,数组剩余元素默认初始化为0,最终存储的内容和原字符串完全无关,所以显示出来是乱码方块。
  • 举个实际场景示例:假设timeNow.c_str()返回的指针地址为0x00000123456789AB,强制转成WCHAR后,数组第一个元素存的是该地址的低16位数值,和L"Hello"的字符没有任何关联。
正确实现示例

场景1:固定长度数组拷贝

如果提前知道字符串长度上限,用安全拷贝函数wcscpy_s实现:

#include <string>
#include <cstring>

std::wstring timeNow = L"Hello";
WCHAR timeWchar[6]; // 长度=字符数5 + 结尾空终止符1,刚好适配当前字符串
wcscpy_s(timeWchar, _countof(timeWchar), timeNow.c_str());

场景2:动态长度数组

如果字符串长度不固定,可根据字符串实际长度分配数组空间:

std::wstring timeNow = L"任意长度的宽字符串";
size_t arrLength = timeNow.size() + 1; // +1 预留空终止符位置
WCHAR* timeWchar = new WCHAR[arrLength];
wcscpy_s(timeWchar, arrLength, timeNow.c_str());

// 数组使用完成后需手动释放内存,避免泄漏
delete[] timeWchar;

场景3:只读传参

如果是给Win32 API传参,大部分API直接支持const WCHAR*类型,无需额外转数组,直接调用c_str()即可:

// 示例:调用MessageBoxW直接传c_str()返回值
MessageBoxW(NULL, timeNow.c_str(), L"提示", MB_OK);

内容的提问来源于stack exchange,提问作者Shivang Thakur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 02:54:02