带有n个变量的字符串插值通常涉及可变参数函数。在C中,是否存在类似于vsprintf
的替代方法,它可以采用动态创建的字符串数组而不是va_list?
int foo (char *s, const char *format, char **strs );
答案 0 :(得分:1)
不,C标准库中没有这样的功能。
鉴于您的格式字符串非常有限(仅支持%s
和宽度修饰符),您可以通过解析格式字符串来自行实现。
答案 1 :(得分:0)
没有,但你可以编写自己的功能,例如:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
extern char *strdup(const char *);
int foo(char *str, const char *fmt, char **arr)
{
int cnt = 0, len = 0, bit = 0;
char *buf, *ptr, *tmp;
/* fmt must be writable */
buf = ptr = strdup(fmt);
if (buf == NULL) {
perror("strdup");
exit(EXIT_FAILURE);
}
while ((tmp = ptr)) {
while ((ptr = strchr(ptr, '%'))) {
/* Support for %% */
if (ptr[1] == '%') {
ptr += 2;
continue;
}
/* Skip first % */
if (bit ^= 1) {
ptr += 1;
continue;
} else break;
}
if (ptr) *ptr = '\0'; /* Tokenize */
len += sprintf(str + len, tmp, arr[cnt++]);
if (ptr) *ptr = '%'; /* Untokenize */
}
free(buf);
return len;
}
int main(void)
{
char *arr[] = {"one", "two", "three"};
char str[100];
foo(str, "%s, %s, %s", arr);
printf("%s\n", str);
return 0;
}