2011-07-07 9 views
11
class MyString 
{ 
public: 
    MyString(const std::wstring& s2) 
    { 
     s = s2; 
    } 

    operator LPCWSTR() const 
    { 
     return s.c_str(); 
    } 
private: 
    std::wstring s; 
}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    MyString s = L"MyString"; 
    CStringW cstring = L"CString"; 
    wprintf(L"%s\n", (LPCWSTR)cstring); // Okay. Becase it has an operator LPCWSTR() 
    wprintf(L"%s\n", cstring); // Okay, fine. But how?   
    wprintf(L"%s\n", (LPCWSTR)s); // Okay. fine. 
    wprintf(L"%s\n", s); // Doesn't work. Why? It prints gabage string like "?." 
    return 0; 
} 

स्ट्रिंग% s प्रारूपित करने के लिए CString कैसे पारित किया जा सकता है?स्ट्रिंग% s प्रारूपित करने के लिए CString कैसे पारित किया जा सकता है?

वैसे, MSDN says (यह अजीब है) जैसा कि यहाँ दिखाया

एक चर तर्क समारोह
स्पष्ट रूप से एक LPCTSTR स्ट्रिंग के लिए cstring डाली में एक cstring वस्तु का उपयोग करने के लिए,:

CString kindOfFruit = "bananas"; 
int  howmany = 25; 
printf("You have %d %s\n", howmany, (LPCTSTR)kindOfFruit); 
+2

"काम नहीं करता" का क्या अर्थ है? संकलित नहीं करता है, अपेक्षित परिणाम नहीं दिखाता है ...? – MikMik

+2

इसमें सी – Puppy

+0

@MikMik के साथ बिल्कुल कुछ नहीं है: यह गैबेज स्ट्रिंग जैसे ** "?" ** ** – Benjamin

उत्तर

9

सीएसटींग विशेष रूप से इस प्रकार डिज़ाइन किया गया है कि इसमें केवल एक पॉइंटर होता है जो एक बफर क्लास में स्ट्रिंग डेटा को इंगित करता है। जब printf के मान से गुजरता है तो इसे प्रारूप स्ट्रिंग में "% s" देखते समय पॉइंटर के रूप में माना जाएगा।

यह मूल रूप से सिर्फ प्रिंटफ के साथ काम करने के लिए हुआ था, लेकिन बाद में इसे कक्षा इंटरफेस के हिस्से के रूप में रखा गया है।


इस पोस्ट में एमएस प्रलेखन पर आधारित है लंबे समय से सेवानिवृत्त है, इसलिए मैं अपने वादे कि वे इस काम करने के लिए जारी रहेगा करने के लिए लिंक नहीं कर सकते।

हालाँकि, और अधिक downvotes जोड़ने भी किसी को इस ब्लॉग पोस्ट मेरे पुराने ज्ञान को साझा करने को पढ़ने से पहले कृपया:

Big Brother helps you

+2

मुझे अभी भी पता नहीं है कि 'printf' का उपयोग करके इसे प्रिंट कैसे करें। क्या आप एक उदाहरण दिखा सकते हैं? –

6
wprintf(L"%s\n", (LPCWSTR)cstring); // Okay. It's been cast to a const wchar_t*. 
    wprintf(L"%s\n", cstring); // UNDEFINED BEHAVIOUR 
    wprintf(L"%s\n", (LPCWSTR)s); // Okay, it's a const wchar_t*. 
    wprintf(L"%s\n", s); // UNDEFINED BEHAVIOUR 

केवल चीज जो आप इस func को पास कर सकते हैं %s के लिए टयन const wchar_t* है। कुछ और अपरिभाषित व्यवहार है। सीएसटींग पास करना बस काम पर होता है।

एक कारण है कि iostream सी ++ में विकसित किया गया था, और ऐसा इसलिए है क्योंकि ये परिवर्तनीय-तर्क फ़ंक्शन भयानक रूप से असुरक्षित हैं, और कभी भी उपयोग नहीं किया जाता है। ओह, और सीएसटींग बहुत सारे कारणों से बहुत पाप है, std::wstring और cout/wcout जहां भी आप कर सकते हैं।

+3

सीएसटींग के लिए अनिर्धारित व्यवहार वास्तव में कार्यान्वयन विशिष्ट व्यवहार है। माइक्रोसॉफ्ट इस उपयोग का समर्थन करता है। –

+2

@ बीओपी यह सी ++ में अपरिभाषित व्यवहार है, क्योंकि यह सी की मानक लाइब्रेरी 'printf' दस्तावेज़ में अपरिभाषित व्यवहार है। वह माइक्रोसॉफ्ट इसका अर्थ देता है (हालांकि मुझे अभी तक एक आधिकारिक दस्तावेज देखना है जो ठीक है, हालांकि) ठीक है, लेकिन कोड अभी भी पोर्टेबल नहीं है। –

+1

@ जोहान्स - यह निश्चित है, लेकिन सवाल यह था कि यह CString के लिए वैसे भी काम करता है। –

2

सामान्यतया यह अपरिभाषित व्यवहार है। this article के अनुसार विज़ुअल सी ++ आपको कवर करने के लिए CString से पीओडी प्रकार में रूपांतरण को आमंत्रित करता है - यह अनिर्धारित व्यवहार के अनुमोदित कार्यान्वयन है। ,

class CStringA 
{ 
     char* m_pString; 
}; 

हालांकि यह char* (एएनएसआई cstring के लिए भी) नहीं है, यह कम या ज्यादा एक ही बात है:

3

CString पहले सदस्य के रूप में एक सूचक है। जब आप किसी भी प्रिंटफ-फ़ंक्शन के फ़ंक्शन (आपके कस्टम कार्यान्वयन सहित, यदि कोई हो) में CString ऑब्जेक्ट पास करते हैं, तो आप CString ऑब्जेक्ट (जो स्टैक पर है) पास कर रहे हैं। %s पार्सिंग का कारण यह पढ़ता है जैसे कि यह एक सूचक था - जो इस मामले में एक मान्य सूचक है (बहुत पहले बाइट पर डेटा m_pString है)।

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

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