簡體   English   中英

無法成功返回我通過在字符串上調用c_str()創建的const char *。 (C ++)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM