【发布时间】:2011-09-17 05:31:41
【问题描述】:
#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]),我想要实现的是一种构建字符串的优雅方式。
第一个问题:需要传递给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。
想法/建议?
【问题讨论】:
-
主要问题似乎是 sprintf 没有做你想做的事。你听说过
strcat吗? -
@karlphillip:这就是我提到“优雅”的原因,字符串复制解决方案依赖于缓冲区操作。问这个问题的全部目的是逃避这种行为并利用某种“分组”。
-
我确实有答案...切换到 C++ 并使用
std::string! -
但是从技术上讲,您在这里所做的也是缓冲区操作,不是吗?您的
str变量在此处充当目标缓冲区。 -
@JAB:我们不要陷入语义争议。是的,当然是。我想你已经完全理解我的意思了。如果您有更好的
term来实现我指定的目标 - 我很乐意听到。
标签: c arrays string pointers printf