过去几年我一直在使用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必须适用于Linux的GCC和Windows的Visual Studio(C90)。
答案 0 :(得分:2)
我认为C不提供标准化的方法来实现这一目标。如果您了解系统上<stdarg.h>
的内部实现,那么很可能会找到涉及 vprintf(3),的系统特定解决方案,但我有一个不同的,符合标准的kludge为你...
工作的东西将涉及声明一个大尺寸的数组,设置你拥有的值,然后只是在调用站点传递数组的每个元素,无论它们是否是集。
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]);
答案 1 :(得分: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;
}