The sprintf
family of functions (sprintf
, snprintf
, vsnprintf
, …)
have this little-known feature to what size your buffer should be. In cases
where you don’t have a fixed upper bound, this is really useful.
For example:
int size = snprintf(/*str=*/NULL, /*size=*/0,
"%d: %s", some_int, some_c_str);
if (size < 0) abort();
int size_with_nul = size + 1;
char *buf = malloc(size_with_nul);
if (buf == NULL) abort();
int result = snprintf(/*str=*/buf, /*size=*/size_with_nul,
"%d: %s", some_int, some_c_str);
if (result < 0) abort();
I have size_with_nul
because snprintf
man pages say
The functions
snprintf()
andvsnprintf()
write at mostsize
bytes (including the terminating null byte (‘\0’)) tostr
.
If you like, check out this tiny header-only library I wrote a couple of years ago and promptly forgot about.
Go forth and please stop manually computing buffer sizes.