webentwicklung-frage-antwort-db.com.de

C: Übergabe einer variablen Anzahl von Argumenten von einer Funktion an eine andere

Hier ist ein kleines Problem, mit dem ich gerade konfrontiert bin -> Ich versuche eine Funktion zu schreiben, die eine char * -Nachricht und eine variable Anzahl von Argumenten akzeptiert. Meine Funktion ändert die Nachricht ein wenig und ruft dann printf mit der Nachricht und den angegebenen Parametern auf. Essentialy, ich versuche so etwas zu schreiben:

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);

}

Weiß also jemand, was ich tun soll, damit es passiert? Ich wäre für jede Hilfe sehr dankbar :)

14
Ian Traum

Sie möchten varargs verwenden ...

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);
}
3
Edward Clements

Verwenden Sie varargs , um eine variable Anzahl von Parametern zu akzeptieren, und sprintf , um die neue Nachricht zu erstellen

0
msam

Sie können va_list von stdarg.h verwenden,

C-Beispiel: http://www.tutorialspoint.com/cprogramming/c_variable_arguments.htm C++ - Beispiel: http://www.cprogramming.com/tutorial/lesson17.html .

Und natürlich finden Sie in der Manpage: http://linux.die.net/man/3/stdarg

Manpage-Beispiel als Referenz:

#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