C++ 将std::wstring转换为WCHAR*
我不知道如何将C++ 将std::wstring转换为WCHAR*,c++,string,C++,String,我不知道如何将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* 有人知道如何做到这一点吗?我想你可以用 wpProcToSearch=wstrpoctosear
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*
有人知道如何做到这一点吗?我想你可以用
wpProcToSearch=wstrpoctosearch.c_str()
与处理普通std::string一样。如果字符串已经是正确的长度并且不需要更改,则可以通过获取指向第一个字符的指针来获取非常量指针:
WCHAR * wpProcToSearch = &wstrProcToSearch[0];
这保证可以在C++11中工作,而且目前还没有已知的C++03实现
如果只需要常量指针,则应使用c_str
:
const WCHAR * wpProcToSearch = wstrProcToSearch.c_str();
如果您想从
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)
(位于索引<代码> L/COD>)是未定义行为(在实践中,VisualC++中是可以的,至少在VC9/VS2008和VC10/VS2010中)是可以的。
如果字符串大小不合适(即,它不够大,无法满足您的需要),则可以调用
std::wstring::resize()
为新字符腾出空间(即调整内部std::wstring
的缓冲区大小),然后使用&wstr[0]
读写std::wstring
的内容。我推荐这种方法:
wstring str = L"Hallo x y 111 2222 3333 rrr 4444 ";
wchar_t* psStr = &str[0];
这很简单,但您根本无法更改字符串的长度。因此,移动“\0”可能无效…。。。假设
const WCHAR*
是可以接受的。const wchat\u t*有什么问题?你想用它做什么?我真的很讨厌那些窗户类型!我们不需要WCHAR
!是否要转换为WCHAR*
或const WCHAR*
?i、 e.您希望对std::wstring
的内容进行只读访问(const WCHAR*
),还是修改它(WCHAR*
)?谢谢,我从.c_str()开始使用了wpProcToSearch=(WCHAR*)wstrpoctosearch.c_str()创建一个常量wchar_tyu你也许应该解释一下这些指针的有效期。@DavidHeffernan,很好的观点。你知道标准中是否提到了哪些操作可能会使指针失效吗?这不是我的专业领域。很抱歉这是你的领域,不是我的!用charT()
覆盖终止符现在是合法的。@重复数据消除程序:这是C++17中添加的吗?你能提供一份官方证明吗?谢谢。请参阅您链接的问题的最新答案,它位于C++17可湿性粉剂中。