C:将可变数量的参数从一个函数传递到另一个函数
Posted
技术标签:
【中文标题】C:将可变数量的参数从一个函数传递到另一个函数【英文标题】:C: Passing variable number of arguments from one function to another 【发布时间】:2013-03-28 00:20:07 【问题描述】:所以,这是我现在面临的一个小问题 -> 我正在尝试编写一个函数来接受 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);
那么,有人知道我应该怎么做才能实现它吗?如果有任何帮助,我将不胜感激:)
【问题讨论】:
bobobobo.wordpress.com/2008/01/28/… 这不是SO 15830641 的真正副本,也不是SO 15836392 的副本,另一个已作为副本关闭。 【参考方案1】:你想使用可变参数...
void modifyAndPrintMessage( char* message, ... )
// do somehthing custom
va_list args;
va_start( args, message );
vprintf( newMessage, args );
va_end( args );
【讨论】:
我不知道存在像 vprintf 这样的东西!谢谢! @IanTraum,代码不应该是va_start(args, message);
,后跟vprintf(message, args);
吗?
@Edward Clements - 你是对的......我的复制/粘贴错误。我修好了。【参考方案2】:
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);
【讨论】:
K Scott Piel 提供了一种更简单的方法,即使用 vprintf 而不是 vsnprintf,但您的方法也很好而且干净。谢谢! 是的,但在这种情况下,代码不应该是va_start(args, message);
后跟 vprintf(message, args);
吗?
1. printf("%s", newMessage)
- 否则您将 %
扩展两次。 2.newMessage[sizeof(newMessage)-1] = '\0'
将确保终止(如此长的消息将被截断)。
你需要va_end
。在大多数平台上,它什么都不做,但仍然需要。【参考方案3】:
使用varargs 接受可变数量的参数,然后使用sprintf 创建新消息
【讨论】:
其实应该用vsprintf。【参考方案4】:您可以从stdarg.h
使用va_list
,
C 示例:http://www.tutorialspoint.com/cprogramming/c_variable_arguments.htm C++ 示例:http://www.cprogramming.com/tutorial/lesson17.html。
当然,参见手册页:http://linux.die.net/man/3/stdarg
手册页示例供参考:
#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);
【讨论】:
这是一道C题;<cstdarg>
是 C++ 头文件; <cstdarg.h>
是非标准标题(或错字)。【参考方案5】:
有一个包含此功能的库。以下是参考中的一些示例代码:
#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_list对象解析不定数量的参数。
【讨论】:
感谢您的回答,但我知道可变参数是什么,这不是我要求的。以上是关于C:将可变数量的参数从一个函数传递到另一个函数的主要内容,如果未能解决你的问题,请参考以下文章
python如何将可选参数或关键字参数从一个函数传递到另一个函数?