Вот небольшой фрагмент, который я написал некоторое время назад. Возможно, это немного глупо, но, возможно, это то, что вы ищете. Примечание: это не самый эффективный, потому что он делает два vsnprintf
с. Во-первых, определить длину буфера.
char * new_string_from_format(const char * fmt, ...) {
int size;
char * string_buffer;
assert(fmt != NULL);
assert(strlen(fmt) > 0);
// first determine the length the buffer should be
va_list args;
va_start(args, fmt);
size = vsnprintf(NULL, 0, fmt, args) + 1;
va_end(args);
assert(size > 0);
string_buffer = new char[size];
va_start(args, fmt);
vsnprintf(string_buffer, size, fmt, args);
va_end(args);
return string_buffer;
}
Это, вероятно, похоже на asprintf glibc, (но не требует glibc.)