#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
int main(int argc, char * argv[])
{
char *arr[] = { "ab", "cd", "ef" };
char **ptr, **p, *str;
int num = 3;
int size = 0;
ptr = calloc(num, 4);
p = ptr;
for (; num > 0; num--)
size += strlen(*(p++) = arr[num - 1]);
str = calloc(1, ++size);
sprintf(str, "%s%s%s", ptr[0], ptr[1], ptr[2]);
printf("%s\n", str);
return 0;
}
вывод: "efcdab"
как ожидалось.
Теперь все в порядке и подходит, если количество аргументов до sprintf
заранее определено и известно. Однако я пытаюсь добиться элегантного способа построения строки, если число аргументов является переменным (ptr[any]
).
первая проблема: 2-й аргумент, который требуется передать sprintf
, равен const char *format
.
второй: третий аргумент - это фактическое количество переданных аргументов для построения строки на основе предоставленного format
.
как мне добиться чего-то из следующего:
sprintf(str, "...", ...)
в основном, что, если функция получает 4 (или более) указателя на символы, из которых я хочу построить целую строку (в настоящее время в приведенном выше коде есть только 3). это будет означать, что 2-й аргумент должен быть (как минимум) в форме "%s%s%s%s"
, за которым следует список аргументов ptr[0], ptr[1], ptr[2], ptr[3]
.
как вообще можно сделать такой «комбинированный» вызов на sprintf
(или vsprintf
)? все было бы проще, если бы я мог просто предоставить весь массив указателей (** ptr) в качестве 3-го аргумента вместо этого ... но это не представляется возможным? по крайней мере, не таким образом, чтобы sprintf
это понимало, так что, кажется ... поскольку для этого нужна какая-то особая форма format
.
идей / предложений?