由于我不能将LPCSTR从一个函数传递到另一个函数(数据被更改),我尝试将它作为字符串传递。无法从'std :: string'转换为'LPSTR'
但后来我需要再次将其转换回LPSTR。尝试转换时,我收到上述错误:
cannot convert from 'std::string' to 'LPSTR'
我该如何解决这个问题?
由于我不能将LPCSTR从一个函数传递到另一个函数(数据被更改),我尝试将它作为字符串传递。无法从'std :: string'转换为'LPSTR'
但后来我需要再次将其转换回LPSTR。尝试转换时,我收到上述错误:
cannot convert from 'std::string' to 'LPSTR'
我该如何解决这个问题?
这只是因为你应该使用std::string::c_str()
方法。
但这涉及const_cast
在特定的情况,因为c_str()
返回const char *
不能分配给非恒定LPSTR
。
std::string str = "something";
LPSTR s = const_cast<char *>(str.c_str());
但你必须确保的str
寿命会更长那是LPTSTR
变量。
另一提到,如果代码编译为符合Unicode的代码,则类型LPTSTR
和std::string
不兼容。您应该改用std::wstring
。
重要注意事项:如果将上面产生的指针s
从上面传递给试图修改其指向的数据的函数,则会导致未定义的行为。妥善处理它的唯一方法是如果你需要一个LPSTR
,这意味着字符串/可以修改复制串入一个非const缓冲区(例如,通过strdup
)
@Keynslug,最终解决了我的问题。但为什么这(const_cast :)可怕 – Simsons 2010-10-11 13:30:46
最后一段也是错误的,即使在Unicode版本中,LPSTR也是* always * char *。你在谈论LPTSTR。 – 2010-10-11 13:42:01
@ereOn在提到答案时提及'const_cast',但为什么不提及。但为什么'const_cast
您是否在运行somestringvariablename.c_str()
? 这应该工作。
std::string c_str()上有一个功能。不过,我怀疑你不能在你的情况下使用std :: string。
如果OP调用Win32 API,他不能直接使用'std :: string'。 – 2010-10-11 14:49:18
我把它看作是他写的两个函数。因为无论如何你都无法将std :: string传递给任何windows api函数。 – rerun 2010-10-11 15:04:25
LPSTR可以通过使用TCHAR(即在tchar.h中找到)来代替。所以,如果你有一个std :: string,你可以使用std :: string :: c_str()方法。
如果函数,你调用不写入字符串,但只读取它,那么你可以简单地使用string :: c_str方法。如果它要写东西,那么你可能应该通过调用string :: reserve()来确保你的字符串有足够的空间。
。 std::string::c_str()
返回const
指针,你不能只是const_cast
它,并希望世界上一切都好,因为它不是。字符串可能会以各种讨厌的方式进行更改,并且您的原始std::string
将不会被忽略。
试试这个:
// myFunction takes an LPSTR
std::string cppString = "something";
LPSTR cString = strdup(cppString.c_str());
try {
myFunction(cString);
cppString = cString;
} catch(...) {
free(cString);
}
裹在字符串中的智能指针和奖励积分(不要忘了定制删除)摆脱try...catch
的。
如何尝试转换? – 2010-10-11 13:16:23