sprintf() negative return value and errno

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).

Tags:

C

Printf

Errno