2010-03-05 15 views
6

के साथ printf प्रश्न मैं एक printf समस्या में फंस गया हूँ। अगर मैं यहां कुछ मदद प्राप्त कर सकता हूं तो मैं सराहना करता हूं: नीचे दिए गए कोड में, मैं फ़ॉन्ट प्रिंट को पहले printf(), में सही ढंग से विस्थापित कर सकता हूं लेकिन यदि मैं इसे चर में सेट करता हूं, तो मुझे केवल खाली स्ट्रिंग मिलती है। मैं इसे एक चर में कैसे रख सकता हूं और सही मान रख सकता हूं? मैं सिर्फ 'font.family()। Family()। String()। Utf8() डेटा()' हर जगह टाइप करना नहीं चाहता हूं?एक कॉन्स्ट char * चर

मैं एक ही विधि में ऐसा किया:

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); 
} 

और के हस्ताक्षर 'डेटा()'

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 के हस्ताक्षर() है

class String { 
CString utf8() const; 
} 

धन्यवाद।

+0

यह फ़ॉन्ट लाइब्रेरी क्या है? सी ++ में ऐसी कोई बात नहीं है। शायद 'डेटा() 'द्वारा लौटाए गए प्रकार को शामिल करने का प्रयास करें। एक तरफ ध्यान दें, किसी भी कारण से 'std :: string'/'std :: cout' का उपयोग न करें? – GManNickG

+1

यह '.data()' विधि के हस्ताक्षर को जानने में मदद करेगा। – pioto

+0

और family.string() CSTring प्रकार का अस्थायी ऑब्जेक्ट देता है? –

उत्तर

4

font.family().family().string().utf8().data() की श्रृंखला में कुछ अस्थायी वस्तु लौटा रहा है। आपके पहले printf में, अस्थायी वस्तु printf रिटर्न तक दायरे से बाहर नहीं जाती है। दूसरे printf में, पॉइंटर असाइनमेंट के बाद अस्थायी नष्ट हो गया है, और सूचक अब अमान्य है। आप "अपरिभाषित व्यवहार" का एक उत्कृष्ट उदाहरण देख रहे हैं।

इसे ठीक करने के दो तरीके हैं। या तो अस्थायी नष्ट होने से पहले डेटा की एक प्रति बनाओ, या अस्थायी के लिए एक संदर्भ बनाओ। प्रतिलिपि शायद सबसे आसान और स्पष्ट है, जब तक कि कक्षा में एक कॉपी ऑपरेटर होता है। यह मानते हुए कि utf8() एक अस्थायी CString उत्पन्न करता है, इस

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

यह गलत है। जब तक आवश्यकता (अधिक या कम) होने के लिए अस्थायी लोगों को चारों ओर लटका दिया जाता है। –

+0

अस्थायी के लिए एक संदर्भ की गारंटी है, लेकिन कुछ आंतरिक डेटा सदस्य के लिए एक सूचक? मुझे नहीं लगता। –

+0

उद्धृत कोड में कोई संकेत नहीं हैं। "आंतरिक" पॉइंटर्स को सी ++ कन्स्ट्रक्टर/विनाशक तंत्र की देखभाल की जाएगी। –

0
data() करने के लिए

कॉल (यह मानते हुए कि यह एक std :: स्ट्रिंग पर कहा जाता है) हो सकता है जरूरी एक अशक्त-समाप्त स्ट्रिंग वापस नहीं करता है। आप लगभग c_str() चाहते हैं, जो ऐसा करने के लिए परिभाषित किया गया है।

1

आप एक सूचक को कैश कर रहे हैं जो अस्थायी रूप से utf8() (जैसा कि मार्क और नील ने तर्क दिया है) द्वारा लौटाया गया है। utf8() से परिणाम को रखने के लिए आपको fontFamily या तो CString या const CString & में बदलना होगा।

+0

धन्यवाद। यह समस्या को हल करता है। – michael

संबंधित मुद्दे