stringstream, string, char* dönüşüm karışıklık
Benim soru için aşağı haşlanmış olabilir, dize stringstream.str().c_str()
döndü bellekte canlı yapar ve neden o const char*
atanabilir mi?
Bu kod örneği, bunu benden daha iyi açıklayacaktır
#include <string>
#include <sstream>
#include <iostream>
using namespace std;
int main()
{
stringstream ss("this is a string\n");
string str(ss.str());
const char* cstr1 = str.c_str();
const char* cstr2 = ss.str().c_str();
cout << cstr1 // Prints correctly
<< cstr2; // ERROR, prints out garbage
system("PAUSE");
return 0;
}
stringstream.str().c_str()
const char*
bir atanabiliyor varsayımı beni bir süre izini aldı bir hata olmuştur.
Bonus puan için, herkes cout
deyimi yerine neden açıklayabilir
cout << cstr // Prints correctly
<< ss.str().c_str() // Prints correctly
<< cstr2; // Prints correctly (???)
dizeleri doğru yazdırılır?
Visual Studio 2008'de hazırlıyorum.
CEVAP
stringstream.str()
tam ifade sonunda yok olan geçici bir string nesnesi döndürür. Eğer C bir dize (stringstream.str().c_str()
) bir işaretçi varsa, deyimi bittiği yerde silinmiş olan bir dizeye işaret eder. Kodunuzu çöp yazdırır.
Ya da başka bir dizeye dize kopyalamak ve bir C dizeyi almak zorunda:
const std::string tmp = stringstream.str();
const char* cstr = tmp.c_str();
Geçici dize herhangi bir değişiklik yeniden tahsis etmek neden olabileceğinden ve böylece cstr
render const
, geçersiz yaptım unutmayın. Bunun str()
çağrı sonucu tüm saklamak için daha güvenli ve tam ifade sonuna kadar cstr
kullanın:
use_c_str( stringstream.str().c_str() );
Tabii ki, ikincisi kolay olmayabilir ve kopyalama pahalı olabilir. Bunun yerine ne yapabilirim const
başvuru için geçici bağlamak için. Bu başvuru süresi için ömrünü uzatacak:
{
const std::string& tmp = stringstream.str();
const char* cstr = tmp.c_str();
}
En iyi çözüm bu IMO. Ne yazık ki çok bilinen bir şey değil.
C string dönüşüm '*' char sür...
String ve char arasındaki fark[] C tür...
C, char, string değiştirmek mümkün mü?...
String.(Char, char c yöntem değiştir#...
Nasıl String için CharSequence dönüştü...