与vsprintf类似,实现使用动态创建的字符串数组而不是va_list

时间:2014-10-22 08:09:50

标签: c string-interpolation

带有n个变量的字符串插值通常涉及可变参数函数。在C中,是否存在类似于vsprintf的替代方法,它可以采用动态创建的字符串数组而不是va_list?

int foo (char *s, const char *format, char **strs );

2 个答案:

答案 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;
}