sprintf() 的问题是您不知道在调用 sprintf() 之前需要分配多少字节。我通常使用以下 ksprintf() 作为替代。
typedef struct __kstring_t {
size_t l, m;
char *s;
} kstring_t;
int ksprintf(kstring_t *s, const char *fmt, ...)
{
va_list ap;
int l;
va_start(ap, fmt);
l = vsnprintf(s->s + s->l, s->m - s->l, fmt, ap); // not working with glibc 2.0
va_end(ap);
if (l + 1 > s->m - s->l) {
s->m = s->l + l + 2;
kroundup32(s->m);
s->s = (char*)realloc(s->s, s->m);
va_start(ap, fmt);
l = vsnprintf(s->s + s->l, s->m - s->l, fmt, ap);
}
va_end(ap);
s->l += l;
return l;
}
要使用它:
kstring_t *str = calloc(1, sizeof(kstring_t));
ksprintf(str, "%s, %d\n", aString, aInteger);
ksprintf(str, "a second line: %s\n", aString2);
free(str->s); free(s);
ksprintf() 不适用于 glibc 2.0,因为 vsnprintf 不返回字符串中的字节数。您需要在分配中重复加倍内存。Linux 手册页“man snprintf”也给出了一个例子。在您的系统上,您应该检查 vsnprintf() 的行为,它是 C99,而不是 C90。