2013-02-08 10 views
12

http://linux.die.net/man/3/sprintf और http://www.cplusplus.com/reference/cstdio/sprintf/sprintf() के अनुसार और परिवार सफलता पर लिखे गए पात्रों की संख्या लौटाता है। विफलता पर, एक नकारात्मक मूल्य वापस कर दिया जाता है। मुझे लगता है कि प्रारूप स्ट्रिंग खराब होने पर एक त्रुटि हो सकती है, इसलिए ऋणात्मक वापसी मान malloc() त्रुटि के अलावा कुछ और इंगित कर सकता है। क्या errno यह इंगित करने के लिए सेट हो गया है कि त्रुटि क्या थी?sprintf() ऋणात्मक वापसी मूल्य और errno

उत्तर

9

सी ++ सी को defers और सी की आवश्यकता है या sprintf() और परिवार के विवरण में errno का उल्लेख नहीं करता

POSIX (हालांकि कुछ प्रारूप विनिर्देशक के लिए, इन कार्यों mbrtowc() कॉल करने के लिए, EILSEQerrno में सेट कर सकते हैं जो परिभाषित कर रहे हैं) आवश्यकता है कि errno सेट है:

तो एक आउटपुट त्रुटि आई थी, इन कार्यों के लिए एक नकारात्मक मान और त्रुटि इंगित करने के लिए errno सेट करेगा।

EILSEQ, EINVAL, EBADF, ENOMEM, EOVERFLOW स्पष्ट रूप से उल्लेख कर रहे हैं: http://pubs.opengroup.org/onlinepubs/9699919799/functions/fprintf.html

5

मैं हमेशा "इसे आज़माने" विधि की तरह जब मैं इस तरह एक प्रश्न है।

char buffer[50]; 
int n, localerr = 0; 
n = sprintf(buffer, "%s", "hello"); 
localerr = errno; // ensure printf doesn't mess with the result 
printf("%d chars\nerrno: %d\nstrerror:%s\n", n, localerr, strerror(localerr)); 

> 5 chars 
errno: 0 
strerror: Success 

n = sprintf(buffer, NULL, NULL); 
localerr = errno; 
printf("%d chars\nerrno: %d\nstrerror:%s\n", n, localerr, strerror(localerr)); 

> -1 chars 
errno: 22 
strerror: Invalid argument 

ऐसा लगता है कि यह लिनक्स पर जीसीसी के साथ संकलन करते समय सेट हो जाता है। तो यह अच्छा डेटा है, और man page में errno के लिए यह उल्लेख करता है कि printf() (उसी परिवार को sprintf()) errno (नीचे दिए गए उदाहरणों में) बदल सकता है।

+0

सबूत के लिए +1, लेकिन कब्बी के उत्तर में अधिक ठोस दस्तावेज मिला। – cpburnz

+0

ध्यान दें कि "इसे आज़माएं" विधि कार्यान्वयन पर निर्भर करता है मानक मानक और मानक विभिन्न व्यवहार के लिए कमरे की अनुमति नहीं देता है। कभी-कभी यह विधि आपको गुमराह कर सकती है ... – skyking

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