将 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]
(其中wstr
是std::wstring
的非空实例)访问std::wstring
的内容(从其第一个字符的地址开始,并注意字符连续存储在内存中),但必须注意不要超出字符串的预分配内存。
一般来说,如果您有一个长度为L
的std::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*的主要内容,如果未能解决你的问题,请参考以下文章
cpp中std::string和std::wstring 相互转换
从‘std::wstring aka std::basic_string<wchar_t>’到非标量类型‘UString aka std::basic_string<char>