Übergeben Sie varargs an printf [duplicate]

Lesezeit: 3 Minuten

Benutzer-Avatar
wchargin

Ich hätte gerne eine Hilfsfunktion log das macht im wesentlichen folgendes:

log(file, "array has %d elements\n", 10);
// writes "2014-02-03 16:33:00 - array has 10 elements" to &file

Ich habe den Zeitabschnitt unten, und ich habe den Dateischreibabschnitt unten. Das Problem ist jedoch die Methodensignatur selbst log — was soll ich eintragen? Dies sagt, dass die printf Die Deklaration endet mit dem ... Schlüsselwort, aber wie kann ich das in meiner Funktion verwenden?

void log(FILE *f, const char * format, ...) // how would I pass ... to fprintf?

Lassen Sie mich BEARBEITEN dies, um ein bisschen mehr Informationen aufzunehmen.

Ich habe ein const char * now () der eine Zeichenfolge der Form „2014-02-03 16:33:00“ zurückgibt. Ich möchte eine andere Formatzeichenfolge so übergeben. Die beiden Anweisungen sollten gleichwertig sein:

log(file, "array has %d elements\n", 10);
fprintf(file, "%s - array has %d elements\n", now(), 10);

ich weiß das vfprintf lässt mich passieren a va_listaber wie kann ich das sagen now() Als erstes Argument Vor all die anderen?

Benutzer-Avatar
Keith Thompson

Verwenden vprintfdie deklariert ist als:

int vprintf(const char *format, va_list ap);

In deiner log Funktion, aufrufen va_start ein erhalten va_list Wert, dann übergeben Sie diesen Wert an vprintf.

Da Ihr log Funktion dauert a FILE* Argument, das Sie wahrscheinlich verwenden möchten vfprintf statt vprintf (und vielleicht aktualisieren Sie Ihre Frage, um zu fragen fprintf statt printf).

Übrigens sollten Sie die Verwendung des Namens vielleicht noch einmal überdenken log; das ist der Name einer Standardfunktion, die in deklariert ist <math.h>.

Entsprechend Ihrer aktualisierten Frage können Sie den Zeitstempel darin drucken log durch Anruf fprintf direkt:

va_list(args);
fprintf(f, "%s - ", now());
va_start(args, format);
vfprintf(f, format, args);

  • Vielen Dank; Ich habe meine Frage bearbeitet, um das Problem mit va_list zu klären.

    – Waschen

    4. Februar 2014 um 0:58 Uhr

  • @WChargin: Ich habe meine Antwort aktualisiert.

    – Keith Thompson

    4. Februar 2014 um 1:06 Uhr

  • Dieses Dokument en.cppreference.com/w/cpp/utility/variadic/va_start sagt Ihr format muss ein sein int (Anzahl der zu analysierenden Argumente). Wie erklären Sie sich diesen Unterschied?

    – Sandburg

    24. April 2018 um 12:25 Uhr

  • OK!!!! Aha. Das 2. Argument kann wtf sein. va_start sucht nur, was danach kommt.

    – Sandburg

    24. April 2018 um 12:31 Uhr


  • @Sandburg: va_start ist ein Makro, keine Funktion. Das zweite Argument ist der Name des Parameters vor dem , ... in der Funktionsdefinition. Im Beispiel en.cppreference.com/w/cpp/utility/variadic/va_startdieser Parameter ist zufällig int count. va_start() schaut nicht auf den Wert seines zweiten Arguments, es braucht nur seinen Namen, um zu wissen, wo es mit dem Scannen beginnen soll.

    – Keith Thompson

    24. April 2018 um 15:59 Uhr

Benutzer-Avatar
JaredPar

Die gesuchte Methode ist vfprintf oder möglich vprintf (unklar was durch deine Frage)

Dies ist im Wesentlichen die Umsetzung von printf das erlaubt a va_list explizit als Parameter übergeben werden. In Ihrer Methode können Sie also die erstellen va_list für Ihre Methodenparameter und leiten Sie diese weiter an vfprintf

void log(FILE* f, const char* format, ...) { 
  va_list args;
  va_start (args, format);
  vfprintf (f, format, args);
  va_end (args);
}

  • vfprintf entspricht fprintf; vprintf entspricht printf. (Die Frage ist unklar, welche das OP benötigt.)

    – Keith Thompson

    4. Februar 2014 um 0:41 Uhr

  • @KeithThompson guter Anruf, aktualisiert, um beide Referenzen einzuschließen

    – JaredPar

    4. Februar 2014 um 0:52 Uhr

  • Vielen Dank; Ich habe meine Frage bearbeitet, um das Problem mit va_list zu klären.

    – Waschen

    4. Februar 2014 um 0:57 Uhr

1245490cookie-checkÜbergeben Sie varargs an printf [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy