Если вы знаете строку заранее, вы можете просто развернуть массив вручную:
char *array[] = {"tom", "jerry", "cat"};
char *tmpl = "test %s for %s with %s";
sprintf(out, tmpl, array[0], array[1], array[2])
Чтобы сделать это в C динамически:
int my_sprintf(char * restrict out, const char * restrict format, int len, char **args){
switch(len) {
case 0: return sprintf(out, format);
case 1: return sprintf(out, format, args[0]);
case 2: return sprintf(out, format, args[0], args[1]);
case 3: return sprintf(out, format, args[0], args[1], args[2]);
/* ... add more cases as necessary ... */
}
return -1;
}
Возможно, вы могли бы покопаться во внутренних органах GCC, но он не будет переносимым.
PHP-скрипт для генерации соответствующего кода (его нужно запустить перед компиляцией):
int my_sprintf(char * restrict out, const char * restrict format, int len, char **args){
switch(len) {
<?php
for($i=0, $out="";$i<=100;++$i) {
?>
case <?= $i ?>: return sprintf(out, format <?= $out ?>);
<?php
$out .= ", args[$i]";
}
?>
}
}