अस्पष्टता सी स्टैंडर्ड से ही शुरू होती है। C99 और C11 दोनों में snprintf
फ़ंक्शन का समान विवरण है । यहाँ C99 से विवरण है:
7.19.6.5 snprintf
समारोह
सार
1 #include <stdio.h>
int snprintf(char * restrict s, size_t n, const char * restrict format, ...);
विवरण
2 snprintf
समारोह के बराबर है fprintf
, सिवाय इसके कि उत्पादन एक सरणी (तर्क द्वारा निर्दिष्ट में लिखा है s
) के बजाय एक धारा की तुलना में। यदि n
शून्य है, तो कुछ भी नहीं लिखा है, और s
एक शून्य सूचक हो सकता है। अन्यथा, n-1
सरणी से परे आउटपुट वर्ण को सरणी में लिखे जाने के बजाय छोड़ दिया जाता है, और एक अशक्त चरित्र वास्तव में सरणी में लिखे गए वर्णों के अंत में लिखा जाता है। यदि ओवरलैप करने वाली वस्तुओं के बीच नकल होती है, तो व्यवहार अपरिभाषित है।
रिटर्न
3 snprintf
फ़ंक्शन फ़ंक्शन को लिखे गए वर्णों की संख्या देता हैn
पर्याप्त रूप से बड़ा हो गया है, यदि एन्कोडिंग त्रुटि हुई है, तो समाप्त करने वाले अशक्त चरित्र या एक नकारात्मक मूल्य की गिनती नहीं। इस प्रकार, शून्य-समाप्त आउटपुट पूरी तरह से लिखा गया है अगर और केवल अगर लौटाया गया मूल्य nonnegative और से कम है n
।
एक ओर सजा
अन्यथा, सरणी से परे आउटपुट वर्णोंn-1
को सरणी में लिखे जाने के बजाय छोड़ दिया जाता है, और एक अशक्त चरित्र वास्तव में सरणी में लिखे गए वर्णों के अंत में लिखा जाता है।
का कहना है कि
अगर ( s
3-वर्ण-लंबी सरणी के n
बिंदु , और) 3 है, तो 2 वर्ण लिखे जाएंगे, और 2 वें से परे के वर्णों को छोड़ दिया गया है ; फिर शून्य वर्ण उन 2 के बाद लिखा जाता है (और अशक्त वर्ण 3 वर्ण लिखा जाएगा) ।
और यह मेरा मानना है कि मूल प्रश्न का उत्तर है।
उत्तर:
यदि नकल उन वस्तुओं के बीच होती है जो ओवरलैप होती हैं, तो व्यवहार अपरिभाषित होता है।
यदि n
0 है, तो आउटपुट पर कुछ भी नहीं लिखा गया है
, यदि कोई एन्कोडिंग त्रुटियों का सामना नहीं किया गया है, तो आउटपुट हमेशा शून्य-समाप्त होता है ( भले ही आउटपुट आउटपुट सरणी में फिट बैठता है या नहीं ; यदि नहीं, तो कुछ वर्णों को खारिज कर दिया जाता है जैसे कि आउटपुट; सरणी कभी अधिक नहीं होती है),
अन्यथा (यदि एन्कोडिंग त्रुटियों का सामना करना पड़ता है) तो आउटपुट गैर-शून्य-समाप्त रह सकता है ।
दूसरी ओर
अंतिम वाक्य
इस प्रकार, शून्य-समाप्त आउटपुट पूरी तरह से लिखा गया है अगर और केवल अगर लौटाया गया मूल्य nonnegative और से कम है n
अस्पष्टता देता है (या मेरी अंग्रेजी अच्छी नहीं है)। मैं इस वाक्य को कम से कम दो तरीकों से व्याख्या कर सकता हूं:
1. आउटपुट शून्य-समाप्त हो गया है यदि और केवल यदि लौटाया गया मूल्य nonnegative है और उससे कम हैn
(जिसका अर्थ है कि यदि लौटाया गया मान से कम नहीं है n
, अर्थात आउटपुट (सहित) शून्य चरित्र समाप्त करना) सरणी में फिट नहीं होता है, तो आउटपुट शून्य-समाप्त नहीं होता है )।
2. आउटपुट पूरा हो गया है (कोई वर्ण नहीं छोड़ा गया है) यदि और केवल यदि लौटाया गया मूल्य nonnegative और से कम हैn
।
मेरा मानना है कि व्याख्या 1 से ऊपर ANSWER विरोधाभास, गलतफहमी और लंबी चर्चा का कारण बनता है। इसीलिए snprintf
फ़ंक्शन का वर्णन करने वाले अंतिम वाक्य को किसी भी अस्पष्टता को दूर करने के लिए बदलाव की आवश्यकता होती है (जो कि सी भाषा मानक को प्रस्ताव लिखने के लिए आधार देता है)।
मेरा मानना है कि गैर-अस्पष्ट शब्दों का उदाहरण http://en.cppreference.com/w/c/io/fprintf (देखें 4)
) से लिया जा सकता है , इस लिंक के लिए @ "मार्टिन बा" का धन्यवाद।
यह भी देखें कि प्रश्न " स्नप्रिंट: क्या इस फंक के विवरण को बदलने के लिए कोई सी मानक प्रस्ताव / योजनाएं हैं? "