2016-01-27 5 views

उत्तर

8

हां।

7.21.6.5 snprintf समारोह से, N1570 (C11 मसौदा):

snprintf समारोह, fprintf के बराबर है, सिवाय इसके कि उत्पादन (तर्क द्वारा विशिष्ट ईडी) एक सरणी में लिखा है स्ट्रीम के बजाए। यदि एन शून्य है, तो कुछ भी लिखा नहीं गया है, और एस शून्य सूचक हो सकता है। अन्यथा, एन-1 से परे उत्पादन पात्रों बल्कि सरणी के लिए लिखा जा रहा से खारिज कर दिया है, और एक अशक्त चरित्र अक्षर वास्तव में सरणी में लिखा के अंत में लिखा है। अगर कॉपीिंग ऑब्जेक्ट्स के बीच होती है जो ओवरलैप होती है, तो व्यवहार अपरिभाषित है।

अज्ञात डेटा की लंबाई खोजने के लिए यह एक उपयोगी तरीका है जिसके लिए आप पहले आवश्यक लंबाई ढूंढ सकते हैं और फिर सटीक मात्रा आवंटित कर सकते हैं। एक सामान्य उपयोग केस है:

char *p; 

int len = snprintf(0, 0, "%s %s some_long_string_here_", str1, str2); 

p = malloc(len + 1); 

snprintf(p, len + 1, "%s %s some_long_string_here", str1, str2); 
+0

अच्छा, लेकिन आप वास्तव में क्या उद्धृत कर रहे हैं? –

+0

[सी 11 ड्राफ्ट] (http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1570.pdf), धारा 7.21.6.5। – nouney

2

snprintf(3) के अनुसार यह C99 द्वारा POSIX & द्वारा मानकीकृत है। उस आदमी पृष्ठ भी कहते हैं:

Concerning the return value of snprintf(), SUSv2 and C99 contradict 
    each other: when snprintf() is called with size=0 then SUSv2 
    stipulates an unspecified return value less than 1, while C99 allows 
    str to be NULL in this case, and gives the return value (as always) 
    as the number of characters that would have been written in case the 
    output string has been large enough. POSIX.1-2001 and later align 
    their specification of snprintf() with C99. 

तो int i=snprintf(NULL, 0, "कुछ प्रारूप स्ट्रिंग", .... );i में विफलता पर एक नकारात्मक नंबर, या पर एक गैर नकारात्मक उत्पादन आकार रखना चाहिए सफलता।

(मैं वास्तव में नहीं जानता कि क्या होता अगर उत्पादन आकार से बड़े INT_MAX जो बहुत असामान्य है, मुझे लगता है कि यह है कि यह एक विफलता मामला होगा)

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