2013-02-10 40 views
3

我一直在使用C#的最近几年,现在我正在努力写一些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必须在GCC for Linux和Visual Studio for Windows(C90)上工作。

+2

看看vsprintf中 - http://msdn.microsoft.com/en-us/library/28d5ce15(v=vs.71).aspx – OldProgrammer 2013-02-10 22:51:58

+0

当你编译并会发生什么运行你给的代码?你有任何错误? – 2013-02-10 22:55:33

+0

我不认为你想要什么是可能的一步。你可能想要运行一个循环和'sprintf()'然后''strcat()'。另外,请使用'snprintf()'而不是'sprintf()' - 它有点减少了缓冲区溢出错误的可能性。 – 2013-02-10 22:55:58

回答

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]); 
+0

这真的很聪明。这是我的问题的一个很好的解决方案。谢谢。 – 2013-02-10 23:11:04

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; 
} 
相关问题