【问题标题】:C: Passing variable number of arguments from one function to anotherC:将可变数量的参数从一个函数传递到另一个函数
【发布时间】: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);

}

那么,有人知道我应该怎么做才能实现它吗?如果有任何帮助,我将不胜感激:)

【问题讨论】:

标签: c function variables parameter-passing


【解决方案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题; &lt;cstdarg&gt; 是 C++ 头文件; &lt;cstdarg.h&gt; 是非标准标题(或错字)。
【解决方案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对象解析不定数量的参数。

【讨论】:

  • 感谢您的回答,但我知道可变参数是什么,这不是我要求的。
猜你喜欢
  • 2014-10-23
  • 1970-01-01
  • 1970-01-01
  • 2021-04-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多