将 std::wstring 转换为 WCHAR*

Posted

技术标签:

【中文标题】将 std::wstring 转换为 WCHAR*【英文标题】:Convert std::wstring to WCHAR* 【发布时间】:2013-04-19 20:50:14 【问题描述】:

我不知道如何将 std::wstring 转换为 WCHAR*

std::wstring wstrProcToSearch;
WCHAR * wpProcToSearch = NULL;

std::wcin >> wstrProcToSearch;  // input std::wstring
// now i need to convert the wstring to a WCHAR*

有谁知道如何做到这一点?

【问题讨论】:

en.cppreference.com/w/cpp/string/basic_string/c_str ... 假设const WCHAR * 是可以接受的。 const wchat_t* 有什么问题?你想用它做什么?我真的很讨厌那些 Windows 类型!我们不需要WCHAR 您要转换为WCHAR* 还是const WCHAR*?即,您是希望 只读 访问 (const WCHAR*) std::wstring 的内容,还是修改 它 (WCHAR*)? 【参考方案1】:

如果你想从std::wstring 转换为const WCHAR*(即返回的指针赋予字符串内容只读访问权限),那么调用std::wstring::c_str() 方法就可以了:

std::wstring wstrProcToSearch;
std::wcin >> wstrProcToSearch;  // input std::wstring

// Convert to const WCHAR* (read-only access)
const WCHAR * wpszProcToSearch = wstrProcToSearch.c_str();

相反,如果您想修改 std::wstring 的内容,情况就不同了。您可以使用&wstr[0](其中wstrstd::wstring 的非空实例)访问std::wstring 的内容(从其第一个字符的地址开始,并注意字符连续存储在内存中),但必须注意不要超出字符串的预分配内存。

一般来说,如果您有一个长度为Lstd::wstring,您可以访问索引0 中的字符 到(L-1)

C++17 之前,overwriting the terminating '\0'(位于索引L)是未定义的行为(实际上,至少在 Visual C++ 上是可以的VC9/VS2008 和 VC10/VS2010)。

从 C++17 开始,用另一个 NUL 覆盖终止的 NUL ('\0') 已成为 valid,并且不再是未定义的行为。

如果字符串的大小不合适(即它不足以满足您的需要),那么您可以调用std::wstring::resize() 为新字符腾出空间(即调整内部std::wstring 的缓冲区大小),然后使用&wstr[0] 读写 std::wstring 的内容。

【讨论】:

charT()覆盖终结符现在是合法的。 @Deduplicator:这是 C++17 的新增功能吗?能否提供官方参考?谢谢。 查看关于您链接的问题的最新和接受的答案,它在 C++17 的 WP 中。【参考方案2】:

如果字符串已经是适当的长度并且不需要更改,则可以通过指向第一个字符的指针来获取非常量指针:

WCHAR * wpProcToSearch = &wstrProcToSearch[0];

这保证可以在 C++11 中工作,并且没有已知的 C++03 实现不支持。

如果你只需要一个常量指针,你应该使用c_str:

const WCHAR * wpProcToSearch = wstrProcToSearch.c_str();

【讨论】:

您或许应该添加一些解释,说明这些指针的有效期。 @DavidHeffernan,非常好的观点。您是否知道标准是否碰巧提到了哪些操作可能会使指针无效? 不是我的专业领域。对不起。这是你的领域,不是我的!【参考方案3】:

我认为你可以使用

wpProcToSearch = wstrProcToSearch.c_str()

就像使用普通的 std::string 一样。

【讨论】:

谢谢,我使用 wpProcToSearch = (WCHAR *)wstrProcToSearch.c_str() 因为 .c_str() 创建了一个 const wchar_t【参考方案4】:

我推荐这种方法:

wstring str = L"Hallo  x     y   111 2222  3333 rrr 4444   ";
wchar_t* psStr = &str[0];

这很简单,但是您根本无法更改字符串的长度。所以移动“\0”可能无效...

【讨论】:

以上是关于将 std::wstring 转换为 WCHAR*的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能将带有破折号的字符串转换为 wstring?

cpp中std::string和std::wstring 相互转换

无法修改 const wchar 的向量 *

从‘std::wstring aka std::basic_string<wchar_t>’到非标量类型‘UString aka std::basic_string<char>

将 std::string 转换为 std::wstring 时,C++17 codecvt 抛出“错误转换”

如何将 UTF-8 std::string 转换为 UTF-16 std::wstring?