web-dev-qa-db-ja.com

C:ある関数から別の関数に可変数の引数を渡す

だから、これが私が今直面している小さな問題です->私は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);

}

だから、誰かがそれを実現するために私が何をすべきか知っていますか?私はどんな助けにも最も感謝するでしょう:)

15
Ian Traum

可変引数を使用したい...

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

    va_list args;
    va_start( args, message );

    vprintf( newMessage, args );

    va_end( args );
}
17
K Scott Piel
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);
}
4
Edward Clements

varargs を使用して可変数のパラメーターを受け入れ、次に sprintf を使用して新しいメッセージを作成します

0
msam

va_listからstdarg.hを使用できます。

Cの例: http://www.tutorialspoint.com/cprogramming/c_variable_arguments.htm C++の例: http://www.cprogramming.com/tutorial/lesson17.html

もちろん、manページを参照してください: 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);
}
0
Paul