如何在C语言中从值数组格式化字符串?

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标准库中是否有可用的函数可以帮助我,或者,有没有一种方法可以使用数组调用可变参数函数?)

请注意,参数数量永远不会超过我的数组长度。并且类型始终为字符串。所以,我可能会有:

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

但我永远不会少 %s。

注意:C 代码必须适用于 Linux 的 GCC 和 Windows 的 Visual Studio(C90)。


2
看一下 vsprintf - http://msdn.microsoft.com/zh-cn/library/28d5ce15(v=vs.71).aspx - OldProgrammer
当您编译并运行您给出的代码时会发生什么?您会得到任何错误吗? - Code-Apprentice
我认为你想要的不可能一步完成。你可能需要运行一个循环,使用sprintf()然后再使用strcat()。另外,请使用snprintf()代替sprintf(),这样可以在一定程度上减少缓冲区溢出错误的可能性。 - user529758
@Code-Guru 它可以运行,但缓冲区包含垃圾数据(在调试器中是 dX¥.(null).(null).)。 - Daniel James Bryars
1
@LeorA 太棒了,谢谢!如果我将 formatValues 数组转换为 vs_list,则 vsprintf 似乎可以正常工作。我会将其发布为答案并查看是否有反馈。 - Daniel James Bryars
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]);

这真的很聪明。这是我问题的一个很好的解决方案。谢谢。 - Daniel James Bryars

0

sprintf 只接受以 null 结尾的字符数组(即字符串)。

这应该可以工作:

#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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接