This question already has an answer here:
这个问题在这里已有答案:
- Returning 'c_str' from a function 4 answers
从函数4回答'c_str'回答
I am trying to write a function to convert a string to a LPCWSTR. Here's what I have:
我正在尝试编写一个函数来将字符串转换为LPCWSTR。这就是我所拥有的:
LPCWSTR stoLPCWSTR(string str)
{
wstring w(str.begin(), str.end());
return w.c_str();
}
I've run this code with debugging, and at the return line, the transmitted string sits safely in w. However, when it returns, it looks something like this:
我已经通过调试运行此代码,并且在返回行,传输的字符串安全地位于w中。但是,当它返回时,它看起来像这样:
"ﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮꑯ䎕骙ᰀ䪀ɽ绐ɽ▼ཛĖ"
...so basically, garbage. What am I doing wrong?
......所以基本上,垃圾。我究竟做错了什么?
2 个解决方案
#1
2
Your wide string, w
, goes out of scope at the end of the function and is destroyed.
你的宽字符串w在函数末尾超出范围并被销毁。
The value returned by c_str()
no longer points to valid data.
c_str()返回的值不再指向有效数据。
Return the wide-string instead, and use c_str()
on it only at the location it is needed.
改为返回宽字符串,并仅在需要的位置使用c_str()。
wstring stows(string str)
{
return wstring(str.begin(), str.end());
}
//...
wstring ws = stows("hello");
api_call_needing_LPCWSTR(ws.c_str());
#2
2
You're retuning unallocated memory here; the wstring has gone out of scope and you're returning a pointer to it. That's why you get rubbish.
你在这里重新调整未分配的内存; wstring已超出范围,您将返回指向它的指针。这就是你得到垃圾的原因。
#1
2
Your wide string, w
, goes out of scope at the end of the function and is destroyed.
你的宽字符串w在函数末尾超出范围并被销毁。
The value returned by c_str()
no longer points to valid data.
c_str()返回的值不再指向有效数据。
Return the wide-string instead, and use c_str()
on it only at the location it is needed.
改为返回宽字符串,并仅在需要的位置使用c_str()。
wstring stows(string str)
{
return wstring(str.begin(), str.end());
}
//...
wstring ws = stows("hello");
api_call_needing_LPCWSTR(ws.c_str());
#2
2
You're retuning unallocated memory here; the wstring has gone out of scope and you're returning a pointer to it. That's why you get rubbish.
你在这里重新调整未分配的内存; wstring已超出范围,您将返回指向它的指针。这就是你得到垃圾的原因。