SORU
3 EYLÜL 2009, PERŞEMBE


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
3 EYLÜL 2009, PERŞEMBE


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Gee Cee

    Gee Cee

    1 AĞUSTOS 2009
  • Jeb Corliss

    Jeb Corliss

    17 Kasım 2006
  • Vsauce

    Vsauce

    30 Temmuz 2007