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]),那么我想要实现的是构建字符串的一种优雅方式.
第一个问题:需要传递给的第二个参数sprintf是const 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.
想法/建议?
卡尔菲利普的建议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 函数,并且许多系统不支持它。)