[英]Can't successfully return a const char* I have created by calling c_str() on a string. (C++)
我的程序中有一個類,該類具有一個成員變量,一個稱為number的int和一個成員函數getName(),即可以將單詞“ Dice:#”作為const char *返回,但要替換為#通過存儲在類中的數字。
const char* getName(){
return "Dice:";
}
效果很好。
const char* getName(){
std::stringstream ss;
ss << number;
std::string s;
s = "Dice: " + ss.str();
return s.c_str();
}
無法正常工作,並返回似乎是垃圾的內容。 我找不到解決此問題的正確方法。 如果我使用cout打印s.c_str()
它將打印我期望的內容。
簡短而甜美的答案是,您無法按照設置方式進行操作。
從中檢索c_str()
的std::string
對象在函數的本地范圍內。 當函數返回該std::string
對象時,該對象將被銷毀。
那
std::string s;
是局部函數對象。 當函數返回時,它不再存在。 它加入了看不見的合唱團。 沒有了。 這是前對象。
並且當std::string
對象被銷毀時,其任何c_str()
都不再有效。 這就是為什么您會垃圾:未定義的行為。
如果不以某種方式更改其總體設計,則無法執行此操作。 有很多前進的方法。 一些可能性:
std::string
只需從getName()
返回std::string
。 調用它的人都可以存儲此std::string
一段時間,並在需要時使用c_str()
。
std::string
如果此getName()
是一個類方法,則可以有一個私有的std::string
類成員,讓getName()
將字符串存儲在那里,並返回其c_str()
。
因為原始的std::string
繼續存在,所以返回的c_str()
仍然有效。 請注意,這里有一些陷阱。 如果調用方再次調用getName()
,則先前返回的c_str()
將不再有效。
只是養成在C ++代碼中使用和使用std::string
的習慣。 那就是他們的目的。
名稱“ c_str()”應該是一個線索。 如果附近有C代碼,它會為您提供一個與C代碼一起使用的字符串。 這是一個C字符串。 您在這里編寫C代碼嗎? 不,您正在編寫C ++代碼。
除非您正在編寫C代碼或正在與C庫進行交談,否則首先不需要使用c_str
()。 如果要編寫C ++代碼,則應使用std::string
。 如果需要調用C庫函數,請調用c_str()
傳遞適當的C庫函數參數,而不再贅述此C字符串。
您正在創建一個局部變量“ s”,然后返回一個指向strig的指針以及字符串存儲器。
當函數返回時,字符串超出范圍(指針也超出范圍)
最好的選擇是可能將getname更改為返回std :: string,然后如果需要使用c_str,請在返回的位置使用它。
std::string name = object.getName();
printf("name = %s", name.c_str());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.