2010-03-05 21 views
6

Bir printf probleminde sıkışmış durumdayım. Burada bir miktar yardım bulabilirsem minnettar olurum: Aşağıdaki kodda, fontf ailesinin ilk printf(), 'da doğru bir şekilde yer değiştirdiğini görebiliyorum ama değişkene ayarlıyorum, sadece boş bir dize alıyorum. Bunu bir değişkene nasıl yerleştirebilirim ve doğru değerlere nasıl sahip olabilirim? Ben sadece "font.family(). Family(). String(). Utf8(). Data() 'her yerde yazmak istemiyorum.Bir const char * değişkenli printf sorusu

aynı yöntemle bunu:

void myMethod() { 
     const char* fontFamily = font.family().family().string().utf8().data(); 
     // get displayed correctly 
     printf ("drawText1 %s \n", font.family().family().string().utf8().data()); 
     // get an empty string 
     printf ("drawText2 %s \n", fontFamily); 
} 

ve imza verilerinin() '

class CString { 
public: 
    CString() { } 
    CString(const char*); 
    CString(const char*, unsigned length); 
    CString(CStringBuffer* buffer) : m_buffer(buffer) { } 
    static CString newUninitialized(size_t length, char*& characterBuffer); 

    const char* data() const; 
//... 

} 

utf8 imzası() olduğu

class String { 
CString utf8() const; 
} 

Teşekkür ederim.

+0

Bu font kütüphanesi nedir? C++ böyle bir şey yok. Belki de 'data()' tarafından döndürülen türü eklemeyi deneyin. Bir yan not, 'std :: string' /' std :: cout' kullanmak için herhangi bir sebep? – GManNickG

+1

'.data()' yönteminin imzasını öğrenmeye yardımcı olur. – pioto

+0

Ve family.string() CString türünde geçici bir nesne döndürür? –

cevap

4

font.family().family().string().utf8().data() zincirindeki bir şey geçici bir nesne döndürüyor. İlk printf'unuzda, geçici nesne printf döndürene kadar kapsam dışına çıkmaz. İkinci printf'da, işaretçi atama yapıldıktan sonra geçici olarak imha edildi ve işaretçi artık geçersiz. "Tanımlanmamış davranış" ın klasik bir örneğini görüyorsunuz.

Bunu düzeltmenin iki yolu vardır. Geçici olarak yok edilmeden önce verilerin bir kopyasını yapın ya da geçici bir başvuruda bulunun. Sınıfın bir kopya operatörüne sahip olması kaydıyla, kopya muhtemelen en kolay ve en açık olanıdır. utf8() geçici CString üretir varsayıldığında, bu mutlaka bir boşlukla sonlandırılmış dize dönmez (bir std :: ipe denir varsayarak) data() için

CString fontFamily = font.family().family().string().utf8(); 
printf ("drawText2 %s \n", fontFamily.data()); 
+0

Bu yanlış. Tempolanmalar, ihtiyaç duyulduğu sürece (daha fazla veya daha az) asılmak için garantilidir. –

+0

Geçici bir referans garanti edilir, ancak bazı dahili veriye bir işaretçi mi? Bence değil. –

+0

Belirtilen kodda işaretçi yok. "Dahili" işaretçiler C++ kurucu/yıkıcı mekanizma tarafından ele alınacaktır. –

0

çağrı olacaktır. Neredeyse kesinlikle bunu yapmak için tanımlanmış olan c_str() olmasını istersiniz.

1

utf8() tarafından döndürülen geçici birimde bulunan bir işaretçiyi (Mark ve Neil'ın tartıştığı gibi) önbelleğe alıyorsunuz. Sonucu, utf8() kapsamından korumak için fontFamily değerini CString veya const CString & olarak değiştirmeniz gerekir.

+0

Teşekkürler. Bu sorunu giderir. – michael