C:将可变数量的参数从一个函数传递到另一个函数

C:将可变数量的参数从一个函数传递到另一个函数,c,function,variables,parameter-passing,C,Function,Variables,Parameter Passing,所以,我现在面临一个小问题->我正在尝试编写一个函数,它将接受char*消息和可变数量的参数。我的函数将稍微修改消息,然后使用消息和给定参数调用printf。基本上,我想写一些这样的东西: void modifyAndPrintMessage(char* message,...){ char* newMessage; //copy message. //Here I'm modifying the newMessage to be printed,and then I'd lik

所以,我现在面临一个小问题->我正在尝试编写一个函数,它将接受char*消息和可变数量的参数。我的函数将稍微修改消息,然后使用消息和给定参数调用printf。基本上,我想写一些这样的东西:

void modifyAndPrintMessage(char* message,...){
    char* newMessage; //copy message.
    //Here I'm modifying the newMessage to be printed,and then I'd like to print it. 
    //passed args won't be changed in any way.

    printf(newMessage,...); //Of course, this won't work. Any ideas?
    fflush(stdout);

}

那么,有人知道我该怎么做才能实现吗?非常感谢您的帮助:)

用于接受可变数量的参数,然后用于创建新消息

您可以从
标准.h
使用
va_列表

C例如: C++示例:.< 当然,请参见手册页:

手册页示例供参考:

#include <stdio.h>

#include <stdarg.h>

void
foo(char *fmt, ...)
{
    va_list ap;
    int d;
    char c, *s;

   va_start(ap, fmt);
    while (*fmt)
        switch (*fmt++) {
        case 's':              /* string */
            s = va_arg(ap, char *);
            printf("string %s\n", s);
            break;
        case 'd':              /* int */
            d = va_arg(ap, int);
            printf("int %d\n", d);
            break;
        case 'c':              /* char */
            /* need a cast here since va_arg only
               takes fully promoted types */
            c = (char) va_arg(ap, int);
            printf("char %c\n", c);
            break;
        }
    va_end(ap);
}
#包括
#包括
无效的
foo(字符*fmt,…)
{
va_列表ap;
int d;
字符c,*s;
va_启动(ap、fmt);
while(*fmt)
开关(*fmt++){
大小写's':/*字符串*/
s=va_arg(ap,char*);
printf(“字符串%s\n”,s);
打破
案例“d”:/*int*/
d=va_arg(ap,int);
printf(“int%d\n”,d);
打破
案例“c”:/*字符*/
/*只需要在这里施放一个va_arg
接受完全升级的类型*/
c=(char)va_arg(ap,int);
printf(“字符%c\n”,c);
打破
}
va_端(ap);
}

您想使用varargs

void modifyAndPrintMessage( char* message, ... )
{
    // do somehthing custom

    va_list args;
    va_start( args, message );

    vprintf( newMessage, args );

    va_end( args );
}

有一个包含此功能的库。以下是参考资料中的一些示例代码:

#include <stdarg.h>     /* va_list, va_start, va_arg, va_end */

int FindMax (int n, ...)
{
    int i,val,largest;
    va_list vl;
    va_start(vl,n);
    largest=va_arg(vl,int);
    for (i=1;i<n;i++)
    {
        val=va_arg(vl,int);
        largest=(largest>val)?largest:val;
    }
    va_end(vl);
    return largest;
}
#包括/*va_列表、va_开始、va_参数、va_结束*/
int FindMax(int n,…)
{
int i,val,最大值;
va_列表vl;
va_启动(vl,n);
最大值=va_arg(vl,int);
对于(i=1;ival)?最大值:val;
}
va_端(vl);
回报最大;
}

省略号实际上是有效的代码,您可以使用va_list对象解析数量可变的参数。

这不是的真正副本,也不是另一个的副本。我不知道vprintf这样的东西存在!谢谢@IanTraum,代码不应该类似于
va_start(args,message)后接
vprintf(消息,args)?@Edward Clements——你是对的。。。我的部件出现复制/粘贴错误。K Scott Piel给出了一个更简单的方法,使用vprintf而不是vsnprintf,但是你的方法也很好,很干净。非常感谢。是的,但是在这种情况下,代码不应该类似于
va_start(args,message)后接
vprintf(消息,args)?1
printf(“%s”,newMessage)
-否则将展开
%
两次。2.
newMessage[sizeof(newMessage)-1]='\0'
将确保终止(因此长消息将被截断)。并且您需要
va_end
。在大多数平台上,它什么也不做,但仍然需要。感谢您的回答,但我知道varargs是什么,这不是我要问的。这是一个C问题<代码> <代码>是一个C++头;代码>
是一个非标准的标题(或打字)。实际上应该使用vsprintf。
void modifyAndPrintMessage(char* message,...)
{   char newMessage[1024]; // **Make sure the buffer is large enough**
    va_list args;
    va_start(args, message);
    vsnprintf(newMessage, message, args);
    printf(newMessage);
    fflush(stdout);
}