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);
vsnprintfは文字列のバイト数を返さないため、ksprintf()はglibc2.0では機能しません。割り当てのメモリを繰り返し2倍にする必要があります。Linuxのmanページ「mansnprintf」にも例があります。システムでは、vsnprintf()の動作を確認する必要があります。これはC90ではなくC99です。