CString.Format() का उपयोग करके, मैं इसे एक std::map पास कर रहा हूं जो int दिए जाने पर std::string लौटाता है।

इसलिए:

CString cStr;
cStr.Format("%s", IntToStdStringMap[1]);

जहां IntToStdStringMap[1] कुछ स्ट्रिंग लौटाता है, हम कहेंगे "हैलो, वर्ल्ड!"। मुद्दा यह है कि यह हर बार दुर्घटनाग्रस्त नहीं लगता है। अंततः, मुझे एक एक्सेस उल्लंघन प्राप्त होगा।

ऐसा क्यों हो सकता है?

ध्यान रखें, कि कोड को निम्नलिखित में बदलना:

CString cStr;
cStr.Format("%s", IntToStdStringMap[1].c_str());

मुद्दे को कम करता है।

कोई विचार?

1
Frank Palmasani 3 जुलाई 2017, 19:38
2
छोटी स्ट्रिंग अनुकूलन, शायद। लेकिन यह अभी भी अपरिभाषित व्यवहार है, इसलिए वास्तव में तर्क के लायक नहीं है।
 – 
user2100815
3 जुलाई 2017, 19:41
2
CString::Format के लिए डॉक्स यहां तक ​​​​कि प्रारूप मापदंडों के लिए ऑब्जेक्ट पास नहीं करने के बारे में बात करते हैं: msdn.microsoft.com/en-us/library/aa314327(v=vs.60).aspx
 – 
Millie Smith
3 जुलाई 2017, 19:44
मैं सहमत हूँ। एसटीडी :: स्ट्रिंग को सीएसटींग :: प्रारूप में पारित करने का मौका एक दुर्घटना थी जो अपरिभाषित व्यवहार दिखा रहा था। मुझे इस बारे में और जानने में दिलचस्पी थी कि संकलन समय पर यह त्रुटि क्यों नहीं हुई। मेरा मानना ​​​​है कि नील कुछ पर है।
 – 
Frank Palmasani
3 जुलाई 2017, 19:47
मेरा भी यही विचार था। आपके सहयोग के लिए धन्यवाद।
 – 
Frank Palmasani
3 जुलाई 2017, 19:47
1
आपको सी इलिप्सिस ... पर ऑब्जेक्ट पास नहीं करना चाहिए।
 – 
Jarod42
3 जुलाई 2017, 19:51

1 उत्तर

सबसे बढ़िया उत्तर

std::string से CString::Format पास करना सही नहीं है। https://msdn.microsoft.com/en से -us/लाइब्रेरी/aa314327(v=vs.60).aspx:

प्रारूप का वही रूप और कार्य है जो प्रिंटफ फ़ंक्शन के प्रारूप तर्क के रूप में है।

इसका मतलब है, जब प्रारूप विनिर्देशक %s है, तो अपेक्षित तर्क प्रकार char const* है, न कि std::string

इसलिए, का उपयोग

cStr.Format("%s", IntToStdStringMap[1]);

अपरिभाषित व्यवहार का कारण है जबकि का व्यवहार

cStr.Format("%s", IntToStdStringMap[1].c_str());

अच्छी तरह से परिभाषित है।

5
R Sahu 3 जुलाई 2017, 19:45
1
सही। मैं इस बात से सहमत हूं कि हो सकता है कि वे कुछ छोटे स्ट्रिंग ऑप्टिमाइज़ेशन हो रहे हों जिससे संकलन समय पर कोई समस्या न हो। किसी भी तरह से, मैं इसे अपरिभाषित व्यवहार के रूप में लेबल करने और आगे बढ़ने से संतुष्ट हूं। आपके उत्तर के लिए धन्यवाद!
 – 
Frank Palmasani
3 जुलाई 2017, 19:49
@FrankPalmasani, कुछ संकलक यह पता लगाने में सक्षम हैं कि तर्क प्रकार प्रारूप विनिर्देशक से मेल नहीं खाता है जब फ़ंक्शन printf होता है। मुझे यकीन नहीं है कि क्या वे संकलक समय पर समस्या का पता लगाने में सक्षम हैं जब फ़ंक्शन CString::Format है। कौन जानता है कि संकलक द्वारा कौन सा कोड उत्पन्न किया गया था। हम वैसे भी अपरिभाषित व्यवहार को समझने की कोशिश नहीं कर सकते।
 – 
R Sahu
3 जुलाई 2017, 19:58
1
कुछ कंपाइलर प्रिंटफ-शैली के मापदंडों के संकलन-समय सत्यापन का समर्थन करते हैं, लेकिन वे आमतौर पर या तो 1) हार्ड-कोडेड केवल printf और इसके संबंधित कार्यों के लिए, या 2) एक विशेष कंपाइलर निर्देश को उजागर करते हैं जिसे मैन्युअल रूप से लागू किया जाना चाहिए प्रिंटफ जैसे कार्यों को चिह्नित करें। उदाहरण के लिए, विजुअल स्टूडियो 2015 हार्ड-कोडेड है< /a>, जबकि GCC में एक format फ़ंक्शन विशेषता.
 – 
Remy Lebeau
4 जुलाई 2017, 00:07