2010-10-11 62 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的。

相關問題