如何将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
相关产品推荐
相关产品推荐

