Записать вывод в символьный массив до заданного количества символов
#include <stdio.h>int snprintf( char *buf,size_t count,const char *format,... );
libc
Функция snprintf() аналогична fprintf(), за исключением того, что запись производится в буфер buf. Также аналогична sprintf(), но имеет ограничение по размеру записываемых данных (count). Завершающий нуль всегда размещается в конце сгенерированной строки.
Число фактически записанных в буфер данных не включая завершающий нуль. Это значение возвращается даже если count равно 0
(в этом случае buf может быть равен NULL
).
Если возникла ошибка, snprintf() возвращает отрицательное значение и устанавливает errno.
#include <stdio.h>#include <stdlib.h>/* Create temporary file names using a counter */char namebuf[13];int TempCount = 0;char * make_temp_name( void ){snprintf( namebuf, 13, "ZZ%.6o.TMP", TempCount++ );return (namebuf);}int main( void ){FILE *tf1, *tf2;tf1 = fopen( make_temp_name(), "w" );tf2 = fopen( make_temp_name(), "w" );fputs( "temp file 1", tf1 );fputs( "temp file 2", tf2 );fclose( tf1 );fclose( tf2 );return (EXIT_SUCCESS);}
ANSI, POSIX 1003.1
Безопасно вызывать данную функцию в обработчике сигналов, если не обрабатываются данные с плавающей точкой.
Будьте осторожны при использовании snprintf() для кусочного формирования строки:
len += snprintf( &buf[len], RECSIZE - 1 - len, ... );
могут возникнуть проблемы, если snprintf() обрежет строку. Без отдельного сравнения len с RECSIZE
, данный код не защищает буфер от переполнения. После вызова, приводящего к обрезанию строки, len может оказаться больше RECSIZE
и RECSIZE
- 1
- len будет переполнено; следующий вызов при этом будет приводить к переполнению буфера buf.
errno, fprintf(), fwprintf(), printf(), sprintf(), swprintf(), vfprintf(), vfwprintf(), vprintf(), vsnprintf(), vsprintf(), vswprintf(), vwprintf(), wprintf()
Предыдущий раздел: Описание API системной библиотеки