C:将可变数量的参数从一个函数传递到另一个函数
所以,我现在面临一个小问题->我正在尝试编写一个函数,它将接受char*消息和可变数量的参数。我的函数将稍微修改消息,然后使用消息和给定参数调用printf。基本上,我想写一些这样的东西: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
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)代码>?1printf(“%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);
}