В соответствии с http://linux.die.net/man/3/sprintf и http://www.cplusplus.com/reference/cstdio/sprintf/ sprintf()
и семья возвращает количество символов написано об успехе. При сбое возвращается отрицательное значение. Я бы предположил, что ошибка может произойти, если строка формата искажена, поэтому отрицательное возвращаемое значение может указывать на что-то другое, кроме ошибки malloc()
. Установлен ли errno
, чтобы указать, что такое ошибка?
Sprintf() отрицательное возвращаемое значение и errno
Ответ 1
Отказ С++ от C до C не требует или упоминает errno
в описании sprintf()
и семейства (хотя для определенных спецификаторов формата эти функции определены для вызова mbrtowc()
, который может установить EILSEQ
в errno
)
POSIX требует, чтобы был установлен errno:
Если возникла ошибка вывода, эти функции должны вернуть отрицательное значение и установить
errno
для указания ошибки.
EILSEQ, EINVAL, EBADF, ENOMEM, EOVERFLOW указаны явно: http://pubs.opengroup.org/onlinepubs/9699919799/functions/fprintf.html
Ответ 2
Мне всегда нравится метод "попробуйте", когда у меня возникает такой вопрос.
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
Похоже, он устанавливается при компиляции с gcc на linux. Так что хорошие данные и в man page для errno
он упоминает, что printf()
(то же семейство, что и sprintf()
) может измениться errno
(в примерах внизу).