Подтвердить что ты не робот

Sprintf() отрицательное возвращаемое значение и errno

В соответствии с http://linux.die.net/man/3/sprintf и http://www.cplusplus.com/reference/cstdio/sprintf/ sprintf() и семья возвращает количество символов написано об успехе. При сбое возвращается отрицательное значение. Я бы предположил, что ошибка может произойти, если строка формата искажена, поэтому отрицательное возвращаемое значение может указывать на что-то другое, кроме ошибки malloc(). Установлен ли errno, чтобы указать, что такое ошибка?

4b9b3361

Ответ 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 (в примерах внизу).