Существует также уродливый хак, который работает с простым ISO-C: вы можете использовать fopen()
, чтобы открыть пустой файл (/dev/null
на * nix, NUL
на Windows) и установить массив в качестве буфера файла через
setvbuf(file, buffer, _IOFBF, buffer_size)
Это должно работать нормально, если fflush()
нигде в коде не вызывается. Кроме того, программист должен явно позаботиться о строковом разделителе.
Я не вижу необходимости делать это, хотя: * snprintf()
возвращает количество написанных символов, тривиально отслеживать положение буфера.
Можно даже написать функцию для автоматического изменения размера буфера при переполнении: bufprintf.c
Прототип функции -
int bufprintf(char **buffer, size_t *size, size_t *offset,
const char *format, ...);
Пример программы может выглядеть так:
#include <stdio.h>
extern int bufprintf(char **buffer, size_t *size, size_t *offset,
const char *format, ...);
int main(void)
{
size_t size = 0; // must be set!
size_t offset;
char * buffer;
for(int i = 0; i < 100; ++i)
bufprintf(&buffer, &size, &offset, "we rock %i\n", i);
puts(buffer);
printf("size:\t%u\noffset:\t%u\n", (unsigned)size, (unsigned)offset);
}