/* NAME Stringf - printfと同じ形式で文字列を生成する. SYNOPSIS char *Stringf(char *FORMAT [, ARG, ...]); void freeStrings(); DESCRIPTION Stringf は1個以上の不定個の引数を取り,printf と同様の方法で フォーマットされた文字列を返す. FORMAT には printf の第1引数と同様のフォーマット文字列を与え, それにしたがって ARG, ... をフォーマットする.フォーマットされた 文字列は,malloc(3) で必要なだけ割り当てられた領域に生成され, その先頭へのポインタが戻り値として返される. freeStrings は,Stringf で生成された文字列に割り当てられた領域を, 一括して解放する. */ #include #include void free(void *); #define _MaxStrings 4096 static char *_StringTable[_MaxStrings]; static int _STp=0; char *Stringf(char *fmt, ...) { va_list ap; char *str; int r; if ( _STp >= _MaxStrings ) { fprintf(stderr, "string table for Stringf() exhausted.\n"); return NULL; } va_start(ap, fmt); r = vasprintf(&str, fmt, ap); va_end(ap); if ( r < 0 ) return NULL; _StringTable[_STp++] = str; return(str); } void freeStrings() { int i; for (i=0; i<_STp; i++) free(_StringTable[i]); } /* main () { puts(Stringf("%s %d", "abc", 100)); puts(Stringf("%s %c", "def", 'z')); freeStrings(); } */