因为我不能将LPCSTR从一个函数传递给另一个(数据被改变)我试着把它作为一个string传递。
但是后来我需要再把它转换回LPSTR。 尝试转换时,我得到了上述错误:
不能从'std :: string'转换为'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
来代替。
重要提示:如果将结果指针从上面传递给一个试图修改它指向的数据的函数,将会导致未定义的行为。 正确处理它的唯一方法是将字符串复制到非常量缓冲区(例如,通过strdup
)
如果你需要一个LPSTR
,这意味着字符串将会/可能被修改。 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
来获得奖励积分(不要忘记自定义删除者)。
在std :: string c_str()上有一个函数。 但是我怀疑你不能在你的情况下使用std :: string。
你正在运行somestringvariablename.c_str()
? 这应该工作。
LPSTR可以通过使用TCHAR(即在tchar.h中找到)来替代。 所以,如果你有一个std :: string,你可以使用std :: string :: c_str()方法。
如果函数,你调用不写入字符串,但只读取它,那么你可以简单地使用string :: c_str方法。 如果要写东西,那么你可能应该通过调用string :: reserve()来确保你的字符串有足够的空间。