http://linux.die.net/man/3/sprintf और http://www.cplusplus.com/reference/cstdio/sprintf/sprintf()
के अनुसार और परिवार सफलता पर लिखे गए पात्रों की संख्या लौटाता है। विफलता पर, एक नकारात्मक मूल्य वापस कर दिया जाता है। मुझे लगता है कि प्रारूप स्ट्रिंग खराब होने पर एक त्रुटि हो सकती है, इसलिए ऋणात्मक वापसी मान malloc()
त्रुटि के अलावा कुछ और इंगित कर सकता है। क्या errno
यह इंगित करने के लिए सेट हो गया है कि त्रुटि क्या थी?sprintf() ऋणात्मक वापसी मूल्य और errno
उत्तर
सी ++ सी को defers और सी की आवश्यकता है या sprintf()
और परिवार के विवरण में errno
का उल्लेख नहीं करता
POSIX (हालांकि कुछ प्रारूप विनिर्देशक के लिए, इन कार्यों mbrtowc()
कॉल करने के लिए, EILSEQ
errno
में सेट कर सकते हैं जो परिभाषित कर रहे हैं) आवश्यकता है कि errno सेट है:
तो एक आउटपुट त्रुटि आई थी, इन कार्यों के लिए एक नकारात्मक मान और त्रुटि इंगित करने के लिए
errno
सेट करेगा।
EILSEQ, EINVAL, EBADF, ENOMEM, EOVERFLOW स्पष्ट रूप से उल्लेख कर रहे हैं: http://pubs.opengroup.org/onlinepubs/9699919799/functions/fprintf.html
मैं हमेशा "इसे आज़माने" विधि की तरह जब मैं इस तरह एक प्रश्न है।
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
(नीचे दिए गए उदाहरणों में) बदल सकता है।
सबूत के लिए +1, लेकिन कब्बी के उत्तर में अधिक ठोस दस्तावेज मिला। – cpburnz
ध्यान दें कि "इसे आज़माएं" विधि कार्यान्वयन पर निर्भर करता है मानक मानक और मानक विभिन्न व्यवहार के लिए कमरे की अनुमति नहीं देता है। कभी-कभी यह विधि आपको गुमराह कर सकती है ... – skyking