@vnp's code is solid and helpful, but his stringify_state_helper
is a single-purpose function, and still leaves a degree of repetition and memory management in stringify_state
. I'd rather have general-purpose to_string
that takes printf-style arguments, allocates sufficient space for the converted result, and prints into that space, and returns the result:
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
char *to_string(char const *fmt, ...) {
va_list args;
va_start(args, fmt);
va_list args_dupe;
va_copy(args_dupe, args);
int size = vsnprintf(NULL, 0, fmt, args);
char *ret = malloc(size+1);
if (ret != NULL)
vsnprintf(ret, size+1, fmt, args_dupe);
return ret;
}
In fairness, this does require a little more code, and the v*printf
functions are a bit less known (and argument-list macros) a bit less known, so some may find it a bit more difficult to understand.
On the other hand, in exchange for that bit of extra investment, we get something that's more general, and works much more as I think most people would expect--for example, something like this:
char *s = to_string("%d, %d", 1, 2);