Может ли sprintf() завершиться с ошибкой?

Не могу найти конкретики. В манах есть описание для целой группы функций *printf. Указано, что возвращается либо число напечатаных символов, либо отрицательное значение в случае ошибки. Более того, списка errno не приводится как для других функций, отсюда ещё большее недопонимание ситуации. Те, которые работают с файловым дескриптором - с ними более-менее понятно, но те, которые работают с буфером ( в том числе sprintf ), с ними у меня нет чёткой ясности, в каких случаях может произойти ошибка.


Ответы (1 шт):

Автор решения: Stanislav Volodarskiy

Да, может, если ошибка произойдет при преобразованиии многобайтовых символов в однобайтовую кодировку (я много чего попробовал, кажется, это единственный источник возможной ошибки для sprintf):

#include <locale.h>
#include <stdio.h>
#include <wchar.h>

int main() {
    setlocale(LC_ALL, "C");
    wchar_t c = 128;
    char buffer[100];
    if (sprintf(buffer, "%lc", c) < 0) {
        printf("error\n");
    }
}
$ gcc -std=c11 -pedantic -Wall -Wextra -Werror -O temp.c && ./a.out
error

Цитата из стандарта:

  1. number of characters written to buffer (not counting the terminating null character), or a negative value if an encoding error (for string and character conversion specifiers) occurred
→ Ссылка