2014-01-07 242 views
28

有如下所示的代碼。我有問題通過參數。從'const char *'到'char *'的無效轉換

stringstream data; 
char *addr=NULL; 
strcpy(addr,retstring().c_str()); 

retstring()是一個返回字符串的函數。

//更多代碼

printfunc(num,addr,data.str().c_str()); 

我得到的錯誤

從 '爲const char *' 到 '字符*' 無效的轉換。

初始化的功能

上述線的參數3 '空隙Printfunc(INT,字符*,字符*)' 的參數3。該函數被調用如下所示

void Printfunc(int a,char *loc, char *stream) 

請讓我知道如果我需要更改任何初始化。

+2

編譯器希望將char *流更改爲const char *流 – marcinj

+0

下面的答案處理編譯錯誤,但您還需要爲傳遞給'strcpy'的目標緩衝區分配一些內存 - 您不能僅僅通過NULL指針作爲目標參數 – mathematician1975

+1

調用'data.str().c_str()'可能會有令人驚訝的結果。 – Chad

回答

37

好,data.str().c_str()產生一個char const*,但你的函數Printfunc()希望有char*秒。基於名稱,它不會改變的觀點,而只是將它們打印和/或使用它們來命名文件,在這種情況下,你或許應該修正你的宣言是

void Printfunc(int a, char const* loc, char const* stream) 

的替代方法可能是轉所述char const*char*但固定聲明優選:

Printfunc(num, addr, const_cast<char*>(data.str().c_str())); 
12

string::c.str()返回const char *類型的字符串所看到here

速戰速決:儘量鑄造printfunc(num,addr,(char *)data.str().c_str());

雖然上述可能工作,但它是未定義的行爲,並且不安全。

下面是使用模板一個更好的解決方案:

char * my_argument = const_cast<char*> (...c_str()); 
+3

第一個問題是使用強制轉換去除常量。第二個問題是使用C風格的演員。 –

+1

謝謝,我生鏽了。我會更新我的解決方案。 OP參考@ Dietmar的回覆 – Louis93

+0

@ Louis93是的,你的快速修復工作。但它如何不安全? – user2333234

1

首先此代碼段的

char *addr=NULL; 
strcpy(addr,retstring().c_str()); 

是無效的,因爲你沒有在你要複製retstring()。c_str()的地方分配內存。

至於錯誤消息,那麼它已經足夠清楚了。表達式data.str()。c_str()的類型是const char *,但函數的第三個參數聲明爲char *。您不能將類型爲const char *的對象分配給char *類型的對象。如果函數不改變第三個參數指向的對象,或者你不能傳遞類型爲const char *的參數,那麼函數應該將第三個參數定義爲const char *。

相關問題