snprintf()

Записать вывод в символьный массив до заданного количества символов

Прототип:

#include <stdio.h>
int snprintf( char *buf,
size_t count,
const char *format,
... );

Аргументы:

buf
Указатель на буфер, куда будет записана отформатированная строка.
count
Максимальный размер буфера, включая завершающий нуль.
format
Строка, характеризующая формат выходной информации. Она определяет какие дополнительные аргументы следует передать функции. Дополнительная информация о формате параметра fmt указана на странице printf().

Библиотека:

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 системной библиотеки