用可变数量的参数构建一个字符串

XXL*_*XXL 5 c arrays string printf pointers

#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;
}
Run Code Online (Sandbox Code Playgroud)

输出:"efcdab"如预期的那样.

现在,如果参数计数sprintf为预定且已知,则这一切都很好并且是合适的.但是,如果参数count是variable(ptr[any]),那么我想要实现的是构建字符串的一种优雅方式.

第一个问题:需要传递给的第二个参数sprintfconst char *format.
第二个:第三个参数是传递参数的实际数量,以便根据提供的内容构建字符串format.

我怎样才能实现以下目标:

sprintf(str, "...", ...)

基本上,如果函数接收4个(或更多)char指针,我想构建一个完整的字符串(当前,在上面提供的代码中,只有3个).这意味着,第二个参数必须(至少)以形式"%s%s%s%s",然后是参数列表ptr[0], ptr[1], ptr[2], ptr[3].

如何能够首先对sprintf(或vsprintf)进行这样的"组合"呼叫?事情会更容易,如果我可以提供一个完整的指针数组(**ptr)作为第三个参数,而不是..但这似乎不可行?至少,不是以sprintf理解它的方式,所以它似乎......因为它需要一些特殊的形式format.

想法/建议?

JAB*_*JAB 1

卡尔菲利普的建议strcat似乎是这里的解决方案。或者更确切地说,您更有可能想要使用类似的东西strncat(尽管如果您正在使用支持它的 C 库,我建议使用strlcat,在我看来,它比strncat)。

因此,sprintf(str, "%s%s%s", ptr[0], ptr[1], ptr[2]);您可以这样做,而不是这样做:

int i;

for (i = 0; i < any; i++)
    strncat(str, arr[i], size - strlen(str) - 1);
Run Code Online (Sandbox Code Playgroud)

(或者strlcat(str, arr[i], size);;好处是strlcat,如果目标缓冲区太小,它的返回值将指示重新分配需要多少字节,但它不是标准 C 函数,并且许多系统不支持它。)