According to http://linux.die.net/man/3/sprintf and http://www.cplusplus.com/reference/cstdio/sprintf/ sprintf()
and family return the number of characters written on success. On failure, a negative value is returned. I would assume that an error could occur if the format string is malformed so a negative return value could indicate something other than a malloc()
error. Does errno
get set to indicate what the error was?
The fprintf() , printf() , and sprintf() functions return the number of characters output, or a negative value if an output error occurs.
If an output error was encountered, these functions shall return a negative value and set errno to indicate the error.
sprintf stands for “String print”. Instead of printing on console, it store output on char buffer which are specified in sprintf.
Warning: The sprintf function can be dangerous because it can potentially output more characters than can fit in the allocation size of the string s . Remember that the field width given in a conversion specification is only a minimum value. To avoid this problem, you can use snprintf or asprintf , described below.
C++ defers to C and C does not require or mention errno
in the description of sprintf()
and family (although for certain format specifiers, these functions are defined to call mbrtowc()
, which may set EILSEQ
in errno
)
POSIX requires that errno is set:
If an output error was encountered, these functions shall return a negative value and set
errno
to indicate the error.
EILSEQ, EINVAL, EBADF, ENOMEM, EOVERFLOW are mentioned explicitly: http://pubs.opengroup.org/onlinepubs/9699919799/functions/fprintf.html
I always like the "try it out" method when I have a question like this.
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
Looks like it gets set when compiling with gcc on linux. So that's good data, and in the man page for errno
it does mention that printf()
(same family as sprintf()
) may change errno
(in the examples at the bottom).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With