2010-10-11 199 views
17

由于我不能将LPCSTR从一个函数传递到另一个函数(数据被更改),我尝试将它作为字符串传递。无法从'std :: string'转换为'LPSTR'

但后来我需要再次将其转换回LPSTR。尝试转换时,我收到上述错误:

cannot convert from 'std::string' to 'LPSTR'

我该如何解决这个问题?

+0

如何尝试转换? – 2010-10-11 13:16:23

回答

23

这只是因为你应该使用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的代码,则类型LPTSTRstd::string不兼容。您应该改用std::wstring

重要注意事项:如果将上面产生的指针s从上面传递给试图修改其指向的数据的函数,则会导致未定义的行为。妥善处理它的唯一方法是如果你需要一个LPSTR,这意味着字符串/可以修改复制串入一个非const缓冲区(例如,通过strdup

+0

@Keynslug,最终解决了我的问题。但为什么这(const_cast :)可怕 – Simsons 2010-10-11 13:30:46

+1

最后一段也是错误的,即使在Unicode版本中,LPSTR也是* always * char *。你在谈论LPTSTR。 – 2010-10-11 13:42:01

+0

@ereOn在提到答案时提​​及'const_cast',但为什么不提及。但为什么'const_cast (str.c_str())'是未定义的行为?那是对的,因为我们无法保证'str'的​​生命周期会比'LPTSTR'变量的寿命更长吗? – Keynslug 2010-10-11 13:46:20

0

您是否在运行somestringvariablename.c_str()? 这应该工作。

1

std::string c_str()上有一个功能。不过,我怀疑你不能在你的情况下使用std :: string。

+0

如果OP调用Win32 API,他不能直接使用'std :: string'。 – 2010-10-11 14:49:18

+0

我把它看作是他写的两个函数。因为无论如何你都无法将std :: string传递给任何windows api函数。 – rerun 2010-10-11 15:04:25

0

LPSTR可以通过使用TCHAR(即在tchar.h中找到)来代替。所以,如果你有一个std :: string,你可以使用std :: string :: c_str()方法。

0

如果函数,你调用不写入字符串,但只读取它,那么你可以简单地使用string :: c_str方法。如果它要写东西,那么你可能应该通过调用string :: reserve()来确保你的字符串有足够的空间。

5

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的。

相关问题