2016-08-17 208 views
-1

由於某種原因c_str()返回空字符串,參數const chart**out_function將保存文件操作的方法名稱,如fopen所以基本上我所做的是將字符串轉換爲c_str(),但是我得到下面一個空字符串是我該怎麼辦來電c_str()返回空字符串

在這一部分,我只需要準備一本字典與操作名稱,你可以看到,我只是發送「的fopen」作爲字符串

pp::VarDictionary fileOp; 
    pp::VarArray args; 
    args.Set(0, "filename.txt"); 
    args.Set(1, "wb"); 
    fileOp.Set("args", args); 
    fileOp.Set("cmd", "fopen"); 

此功能將解析上面發送的字典並返回該函數的名稱out_function和在out_params

int ParseMessage(pp::Var message, const char** out_function, 
     pp::Var* out_params) { 

我用這行代碼來C_STRING字符串轉換,但它返回空文本

*out_function = cmd_value.AsString().c_str(); 

這裏是完整代碼,它是基於谷歌本地客戶端,但在同時它是標準的C/C++代碼

http://pastebin.com/S4P8aZqL

+0

您正在存儲一個指向被銷燬的臨時指針。 –

+2

不要發送垃圾郵件標籤。沒有語言「C/C++」,並且片段顯然是C++,而不是C. – Olaf

+0

它涉及它們三個,我不是垃圾郵件 –

回答

7

c_str()結果是唯一的,只要一個有效的產生該結果的std::string對象是有效的。

在你的情況下,AsString()呼叫產生一個臨時std::string對象,然後立即銷燬。之後,那個c_str()調用的結果不再有任何意義。試圖訪問該指針指向的內存會導致未定義的行爲。

不要試圖存儲由c_str()返回的指針。如果您需要將該字符串長時間作爲C字符串,請自行爲其分配內存緩衝區,並將c_str()的結果複製到該緩衝區。

另一個(更好)的想法是不急於轉換爲C字符串。返回結果爲std::string,並在最後一刻致電c_str():當你真的真的需要C字符串時。

+0

感謝您的答案,這裏是我用來解決這個問題的代碼 '* out_function = strdup(cmd_value.AsString()。c_str());' –

+0

@Mohammad Abu Musa:這將解決它,但現在你有一個'malloc'的原始內存塊來手動管理。正如我所說,一個更好的想法是切換到使用'std :: string'直到最後一刻。 – AnT

+0

謝謝,我只是這樣做,我認爲使用'std :: string'是一個更好的方法 –