Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将std::wstring转换为WCHAR*_C++_String - Fatal编程技术网

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可湿性粉剂中。