|
正直申しますと私はこの長大なスレッドを全部読みこなしてないんですが、
気になるのは「動的な引数」がどういう形で引き渡されるのか明確でないように思われる点です。
動的な引数を処理するのはわかりましたが、ではその動的な引数をよこす関数は一体どのようなものなんでしょうか?
それをはっきりさせるのが先決のような気がするんですが…
仮にランダムに引数を生成する形でコードを書いてみましたがどうでしょう。
まあdprintfに渡す時点では既に「動的」ではなくなってしまってますが、
プログラム全体で言えば動的に発生するデータを処理してますよね?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
union UN {
int i;
double d;
char *str;
};
int generate(union UN **u, char *format){ /* 「動的な引数」を生成 */
int i, j, t, l;
int count = rand() / (RAND_MAX / 10) + 1;
if( !(*u = malloc(count * sizeof(union UN))) ) exit(1);
for(i = 0; i < count; i++){
t = rand() % 3;
switch(t){
case 0:
(*u)[i].i = rand();
strcat(format, "%d\n");
break;
case 1:
(*u)[i].d = (double)rand() / (double)RAND_MAX;
strcat(format, "%f\n");
break;
case 2:
l = rand() % 10 + 1;
if( !((*u)[i].str = calloc(l, 1)) ) exit(1);
for(j = 0; j < l - 1; j++)
(*u)[i].str[j] = 'a' + rand() % 26;
strcat(format, "%s\n");
}
}
return count;
}
void dprintf(char *format, int count, union UN *u){
int i, j;
char buffer[256], *p = format;
for(i = 0; i < count; i++){
j = 0;
while(p[j++] != '%' || p[j] == '%');
j += strcspn(&p[j], "cdiouxefgps]"); /* 引数一つ分ごとに分解 */
strncpy(buffer, p, ++j);
buffer[j] = '\0';
printf(buffer, u[i]);
p += j;
}
if(*p) printf("%s", p);
}
int main(void){
int count;
char format[256] = {0};
char *p = format;
union UN *un;
srand((unsigned)time(NULL));
count = generate(&un, format);
printf("書式制御文字列:\n");
while(*p){
if( *p++ == '\n' ) printf("\\n");
else putchar(*p++);
}
printf("\n\n");
dprintf(format, count, un);
return 0;
}
|