作为asprintf()
一个 GNU 扩展,其他面临这个问题的人可能想要避免它。
相反,它可以这样做,例如
#define GPIO_PATH_VALUE "/sys/class/gpio/gpio%d/value"
char * path;
path = malloc(strlen(GPIO_PATH_VALUE) + 5);
// error checking needed!
sprintf(path, GPIO_PATH_VALUE, 4); // better snprintf?
// or
sprintf(path, GPIO_PATH_VALUE, 67);
path = realloc(path, strlen(path)+1);
// no error checking needed, as we definitely shrink or nop, not extend.
如果很清楚,那就GPIO_PATH_VALUE
这么简单。
如果它变得更复杂,你可以做
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
char * vbsprintf(const char * format, va_list ap)
{
va_list ap2;
va_copy(ap2, ap);
int len = vsnprintf(NULL, 0, format, ap2);
va_end(ap2);
char * str = malloc(len + 1);
if (!str) return NULL;
vsnprintf(str, len + 1, format, ap);
return str;
}
char * bsprintf(const char * format, ...)
{
va_list ap;
va_start(ap, format);
char * str = vbsprintf(format, ap);
va_end(ap);
return str;
}
如果您的系统支持vsnprintf(NULL, 0,
以确定所需的长度。