2010-09-12 23 views
11

क्या किसी को पता है कि सी मानक पुस्तकालय में snwprintf फ़ंक्शन क्यों नहीं है?सी में snwprintf फ़ंक्शन क्यों नहीं है?

मुझे swprintf के बारे में पता है, लेकिन इसमें wchar_t संस्करण snprintf के समान अर्थशास्त्र नहीं हैं। जहाँ तक मेरा बता सकते हैं, वहाँ का उपयोग कर [v]swprintf एक snwprintf समारोह को लागू करने के लिए कोई आसान तरीका है:

snprintf के विपरीत, swprintf आवश्यक बफर आकार वापस नहीं करता है; यदि आपूर्ति बफर अपर्याप्त है, तो यह केवल -1 लौटाता है। यह एन्कोडिंग त्रुटियों के कारण विफलता से अलग नहीं है, इसलिए मैं प्रगतिशील बड़े बफर के साथ पुनः प्रयास नहीं कर सकता हूं कि यह अंततः सफल होगा।

मुझे लगता है कि मैं बफर का अंतिम तत्व गैर-एनयूएल होने के लिए सेट कर सकता हूं, swprintf पर कॉल करें, और मान लें कि यह तत्व तब हुआ जब वह तत्व एनयूएल है। हालांकि, क्या यह काम करने की गारंटी है? swprintf विफल होने पर मानक निर्दिष्ट नहीं करता है कि बफर किस स्थिति में होना चाहिए। (इसके विपरीत, snprintf वर्णन करता है कि कौन से वर्ण लिखे गए हैं और जिन्हें त्याग दिया गया है।)

+0

मुझे लगता है कि आप सही हैं कि आप 'swprintf' विफल होने पर बफर की सामग्री के बारे में कुछ भी नहीं मान सकते हैं। क्या आप 'errno' का उपयोग कर सकते हैं? मुझे पता है कि यह POSIX पर काम करेगा लेकिन सी को एन्कोडिंग त्रुटियों के लिए 'EILSEQ' की आवश्यकता नहीं हो सकती है ...? –

+0

@ आर ..: धन्यवाद। 'errno' एक दिलचस्प विचार है। मुझे लगता है कि अगर मैं एक पोर्टेबल समाधान चाहता हूं, हालांकि, मुझे फ्रीबीएसडी से वास्तविक 'बनामप्रिंटफ' कार्यान्वयन को संशोधित करना पड़ सकता है। = ( – jamesdlin

+0

ध्यान रखें, printf-family फ़ंक्शन को पुन: कार्यान्वित करना शायद एक बुरा विचार है, क्योंकि आप गारंटी नहीं दे सकते कि आप सभी लोकेल-विशिष्ट कार्यक्षमता को डुप्लिकेट करते हैं। –

उत्तर

4

लैरी जोन्स here द्वारा दिए गए उत्तर को देखें।

अनिवार्य रूप से, swprintf C95 में जोड़ा गया है, जबकि snprintf (snprintf के लिए) C99 में और कई कार्यान्वयन के बाद से जोड़ा गया है पहले से ही आवश्यक वर्णों की संख्या लौट आए और यह एक उपयोगी चीज लग रहा था ऐसा करने के लिए, कि व्यवहार है कि मानकीकृत किया गया था। उन्होंने नहीं सोचा था कि swprintf के साथ इसे जोड़कर पिछड़ा संगतता तोड़ने के लिए व्यवहार काफी महत्वपूर्ण था (जिसे कई वर्षों पहले उस व्यवहार के बिना जोड़ा गया था)।

+0

मैं मानता हूं कि वे 'swprintf' को बदलकर पिछड़ा संगतता तोड़ नहीं सकते थे, लेकिन वे एक नया 'snwprintf' फ़ंक्शन जोड़ सकते थे। – jamesdlin

+0

स्पष्ट रूप से उन्हें यह नहीं लगता था कि इस व्यवहार को लागू करने के लिए केवल एक और फ़ंक्शन जोड़ने के लायक होगा। –

+0

असल में, मानकीकरण से पहले' स्नप्रिंटफ 'के कई ऐतिहासिक संस्करण समान थे टूटा हुआ "रिटर्न -1" व्यवहार 'swprintf' के रूप में। समिति ने इसे तोड़ दिया और इसके बजाय सही व्यवहार निर्दिष्ट किया, जिसने पुराने यूनिक्स (एसयूएसवी 2) मानक के साथ संगतता तोड़ दी। –

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