2012-07-20 5 views

उत्तर

18

_ से शुरू होने वाले वैश्विक नामस्थान में पहचानकर्ता कार्यान्वयन के लिए आरक्षित हैं। _snprintf सिर्फ एक समारोह है कि कार्यान्वयन (विजुअल स्टूडियो) प्रदान किया गया है। इसके लिए तर्क के रूप में, विजुअल स्टूडियो सी 8 9 लागू करता है, और snprintf बाद के सी 99 मानक का हिस्सा है।

कि इसके अलावा, दोनों कार्यों का अर्थ विज्ञान वापसी प्रकार है, जो snprintf में हमेशा से वर्णों की संख्या कि स्वरूपित स्ट्रिंग लेता है (कि क्या वहाँ बफर में पर्याप्त स्थान था या नहीं, जबकि _snprintfवापस आ जाएगी है में अलग हैं । एक ऋणात्मक संख्या अगर वहाँ बफर में पर्याप्त स्थान नहीं है

है यही कारण है, एक बफर सिर्फ उत्पादन के लिए काफी बड़ी आप कर सकते हैं आवंटित करने के लिए:

int size = snprintf(0, 0, "%s %d\n", str, i); 
char * buffer = malloc(size+1); 
snprintf(buffer, size+1, "%s %d\n", str, i); 

आप ऐसा नहीं कर सकते कि _snprintf के रूप में के साथ पर लाइफ जानकारी जो फ़ंक्शन उत्पन्न करती है वह यह है कि वर्तमान आकार पर्याप्त नहीं है।

11

snprintf() उस समय मानक का हिस्सा नहीं था जब माइक्रोसॉफ्ट के सी रनटाइम ने इसका समर्थन करना शुरू किया था।

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

3

ऊपर करने के लिए जोड़ा जा रहा है दृश्य स्टूडियो 2015

के बाद से

वहाँ उचित C99 snprintf() और vsnprintf() उपलब्ध हैं, और वे भी अच्छी तरह से जाना असुरक्षित समारोह प्रतिवाद चेतावनी ट्रिगर नहीं करते।
_snprintf_s() या _vsnprintf_s(), प्रदान किए जाने पर, गैर-सी 99 व्यवहार के साथ, एमएसवीसी-विशिष्ट कार्यों के "सुरक्षित रूप" हैं।

0

अपर्याप्त रूप से बड़े बफर (डेविड के उत्तर में वर्णित) के मामले में एक अलग वापसी मूल्य के अलावा, _sn... समूह के कार्य मानक snprintf से दूसरे महत्वपूर्ण संदर्भ में भिन्न होते हैं। यदि लक्ष्य बफर बहुत छोटा बहुत छोटा है, _sn... फ़ंक्शंस इस स्थिति को "सफलता" मानते हैं।

और अधिक विस्तार में, यदि लक्ष्य बफर काफी लंबे समय लेकिन बिना समाप्त शून्य चरित्र पूरे परिणामी अनुक्रम स्टोर करने के लिए है, _sn... कार्यों परिणाम काटना नहीं है, लक्ष्य बफर में समाप्त शून्य नहीं लिखते और परिणामस्वरूप बफर के आकार को वापस कर दें। इसलिए, सामान्य स्थिति में परिणाम शून्य-समाप्त होने की गारंटी नहीं है।

इसी स्थिति में, snprintf परिणामी अनुक्रम के अंतिम चरित्र को त्याग देगा और इसके स्थान पर शून्य टर्मिनेटर लिख देगा। snprintf का परिणाम हमेशा शून्य-समाप्त होता है।

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