2013-05-22 114 views
1

我有一個問題,我無法自己修復。將c_str()分配給字符串

string filenameRaw; 
filenameRaw= argv[1]; 
function(filenameRaw.c_str(),...); 

function(const char* rawDataFile,const char* targetfieldFile,const char* resultFile,const char* filename) 
... 
this->IOPaths.rawData=rawDataFile; 
... 

迄今爲止工作得很好。現在我嘗試在變量IOPaths.rawData中放入另一個字符串...

function(const char* rawDataFile,const char* targetfieldFile,const char* resultFile,const char* filename) 
... 
string filenameRaw; 
filenameRaw=reader.Get("paths", "rawData", "UNKNOWN") 
... 
const char* rawDataFile1=filenameRaw.c_str(); 
cout << "Compare: " << strcmp(rawDataFile,rawDataFile1) <<endl; 
... 
this->IOPaths.rawData=rawDataFile1; 

這不起作用了。後來在我的程序中,我得到了文件名的錯誤。 strcmp默認給出0,所以字符串必須相等。有沒有人知道我做錯了什麼?

+0

可能重複[StringStream/c \ _str()損壞在C++](http://stackoverflow.com/questions/10642253/stringstream-c-str-corruption-in-c) – dasblinkenlight

回答

3

c_str()的輸出的有效性最多隻限於調用對象的生命週期。

我懷疑this->IOPaths.rawData指向一次釋放的內存filenameRaw超出範圍。

一個適當的補救措施是將std :: string而不是[const] char*。一個好的stl實現會在字符串類的寫入語義上使用複製,所以也許你不會反覆複製字符串數據。


在某些情況下(例如,如果所述對象被修改),這可能是更小。

+2

「是限於生命的該對象「並不完全精確。標準狀態「返回的指針可能會因修改對象的其他成員函數的進一步調用而失效」。所以它是真實的,它被對象的生命週期所限制,但沒有什麼能保證它只要對象(可能會更快消失)就會真正生活。 – elmo

+0

非常感謝,解決了我的問題。我擺脫了所有的const char *並將其替換爲std :: string .. – raspiede