3

过去几年我一直在使用 C#,现在我正在尝试编写一些 C。我正在尝试从一个值数组格式化一个字符串。“格式字符串”和数组直到运行时才知道。

在 C# 中,我可以使用数组调用可变参数函数,如下所示:

using System;

namespace ConsoleApplication7
{
    class Program
    {
        static void Main(string[] args)
        {
            string formatString = "{0}.{1}.{2}.{3}";
            string[] formatValues = new[] { "a", "b", "c", "d" };

            string formatted = String.Format(formatString, formatValues);

            //Do something with formatted (now looks like "a.b.c.d")
        }
    }
}

在 C 中我有这个:

#include <stdio.h>
#include <malloc.h>

    int main(int argc, char* argv[])
    {
        char *formatString = "%s.%s.%s.%s";
        char *formatValues[] = {"a","b","c","d"};

        char *buffer = (char*)malloc(100 * sizeof(char));

        //This doesn't work.....
        sprintf(buffer, formatString, formatValues);

        //... buffer is junk

        return 0;
    }

我怎样才能在 C 中做到这一点?

(C 标准库中是否有一个很好的函数可以用来帮助我,或者有没有办法用数组调用 varargs 函数?)

请注意,参数的数量永远不会大于我拥有的数组的长度。并且类型将始终是字符串。所以我可能有

char *formatString = "My Formatted String %s.%s.%s";
char *formatValues[] = {"a","b","c","d","e"};

但我永远不会有太少的 %s。

注意:C 必须在 GCC for Linux 和 Visual Studio for Windows (C90) 上工作。

4

2 回答 2

2

我不认为 C 提供了一种标准化的方法来做到这一点。如果您了解<stdarg.h>系统上的内部实现,可能会拼凑出一个涉及vprintf(3) 的特定于系统的解决方案,但我有一个不同的、符合要求的拼贴给您……

可行的方法是声明一个大尺寸的数组,设置您拥有的值,然后在调用站点传递数组的每个元素,无论它们是否已设置。

char *a[5]; // or a[50], whatever you need

// assign the elements you actually have

printf(format_string, a[0], a[1], a[2], a[3], a[4], a[5]);
于 2013-02-10T23:00:42.847 回答
0

sprintf 接受的唯一数组类型是以空字符结尾的字符数组(即字符串)。这应该有效:

#include <stdio.h>
#include <malloc.h>
int main(int argc, char* argv[])
{
    char *formatStrings[]={"%s","%s","%s","%s"};
    char *buffer= (char*)malloc(100 * sizeof(char));
    char *formatValues[]={"a","b","c","d"};
    char *endofBuffer=buffer;
    int valueCount=4;
    int i;
    for (i=0; i<valueCount; ++i)
    {
        endofBuffer+=sprintf(endofBuffer, formatStrings[i], formatValues[i]);
        if (i<valueCount-1)
            endofBuffer+=sprintf(endofBuffer, "%c", '.');
    }
    printf("%s\n",buffer);
    return 0;
}
于 2013-02-10T23:02:27.887 回答