Wie kann ich in C auf stderr drucken?

Lesezeit: 3 Minuten

Benutzeravatar von wad
Bündel

In C ist das Drucken nach stdout einfach, mit printf aus stdio.h.

Wie kann jedoch auf stderr gedruckt werden? Wir können benutzen fprintf um es anscheinend zu erreichen, aber seine Syntax scheint seltsam. Vielleicht können wir verwenden printf auf stderr drucken?

  • Was ist so “seltsam” an seiner Syntax? Es ist gedruckt wo, wie und was.

    – Eugen Sch.

    17. August 2016 um 16:42 Uhr


  • Ich konzentriere mich darauf. Das einzige Problem, das sich aus der Frage ergibt, ist, dass Sie die Lösung “seltsam” finden. Ansonsten keine Frage. Verwenden fprintf.

    – Eugen Sch.

    17. August 2016 um 16:46 Uhr


  • @ Eugen. Ich stimme mit Ihnen ein. Ich fand es seltsam, da ich nicht wusste, dass stderr eine DATEI ist 🙂

    – Watte

    17. August 2016 um 16:49 Uhr


Fantastischer Benutzer-Avatar von Mr. Fox
Fantastischer Herr Fuchs

Die Syntax ist fast die gleiche wie printf. Mit printf Sie geben das Zeichenfolgenformat und seinen Inhalt an, dh:

printf("my %s has %d chars\n", "string format", 30);

Mit fprintf Es ist dasselbe, außer dass Sie jetzt auch den Ort angeben, an den gedruckt werden soll:

FILE *myFile;
...
fprintf( myFile, "my %s has %d chars\n", "string format", 30);

Oder in Ihrem Fall:

fprintf( stderr, "my %s has %d chars\n", "string format", 30);

Benutzeravatar von Paul R
Paul R

Einige Beispiele für die formatierte Ausgabe an stdout und stderr:

printf("%s", "Hello world\n");              // "Hello world" on stdout (using printf)
fprintf(stdout, "%s", "Hello world\n");     // "Hello world" on stdout (using fprintf)
fprintf(stderr, "%s", "Stack overflow!\n"); // Error message on stderr (using fprintf)

#include<stdio.h>

int main ( ) {
    printf( "hello " );
    fprintf( stderr, "HELP!" );
    printf( " world\n" );
    return 0;
}

$ ./a.exe
HELP!hello  world
$ ./a.exe 2> tmp1
hello  world
$ ./a.exe 1> tmp1
HELP!$
  1. stderr ist normalerweise ungepuffert und stdout normalerweise. Dies kann zu einer seltsam aussehenden Ausgabe wie dieser führen, was darauf hindeutet, dass der Code in der falschen Reihenfolge ausgeführt wird. Das ist es nicht, es ist nur so, dass der stdout-Puffer noch geleert werden muss. Umgeleitete oder geleitete Streams würden dieses Interleave natürlich nicht sehen, da sie normalerweise nur die Ausgabe von stdout nur oder nur stderr sehen würden.

  2. Obwohl zunächst sowohl stdout als auch stderr auf die Konsole kommen, sind beide getrennt und können einzeln umgeleitet werden.

Wenn Sie aktuelle Codes nicht ändern möchten und nur zur Debug-Nutzung.

Dieses Makro hinzufügen:

#define printf(args...) fprintf(stderr, ##args)
//under GCC
#define printf(args...) fprintf(stderr, __VA_ARGS__)
//under MSVC

Veränderung stderr zu stdout wenn Sie zurückrollen möchten.

Es ist hilfreich für das Debuggen, aber es ist keine gute Praxis.

Wissen Sie sprintf? Es ist im Grunde dasselbe mit fprintf. Das erste Argument ist das Ziel (die Datei im Fall von fprintf dh stderr), das zweite Argument ist die Formatzeichenfolge, und der Rest sind wie üblich die Argumente.

Ich empfehle auch Dies printf (und Familie) Referenz.

  • Dies hat nichts mit dem OP zu tun und ist verwirrend formuliert. sprintf “druckt” in einen String und kann nicht auf stderr drucken.

    – David Ljung Madison Stellar

    22. September 2020 um 0:27 Uhr

Benutzeravatar von Samuel Ammonius STUDENT
Samuel Ammonius SCHÜLER

Aus irgendeinem Grund hat niemand erwähnt eprintf() doch, was dasselbe ist wie fprintf(stderr, ...).

eprintf("ERROR: You have caused an error!!1!");

Kurzer Tipp: Wenn Sie stderr zum Debuggen verwenden, können Sie die __LINE__ Makro

#define printfError(str, ...) eprintf("ERROR at line " #__LINE__ ": " str, __VA_ARGS__)

printfError("Division by zero"); // "ERROR at line 2: Division by zero

  • Dies hat nichts mit dem OP zu tun und ist verwirrend formuliert. sprintf “druckt” in einen String und kann nicht auf stderr drucken.

    – David Ljung Madison Stellar

    22. September 2020 um 0:27 Uhr

Benutzeravatar von winterli
Winterli

Um Ihren Kontext zu drucken, können Sie Code wie diesen schreiben:

FILE *fp;
char *of;
sprintf(of,"%s%s",text1,text2);
fp=fopen(of,'w');
fprintf(fp,"your print line");

  • Dies fügt den vorherigen Antworten nichts hinzu und beantwortet die Frage nicht wirklich.

    – Fantastischer Herr Fuchs

    30. April 2019 um 8:43 Uhr

  • Diese sprintf()-Anweisung verursacht Speicherbeschädigung! … Ich rate Ihnen dringend, sich darüber zu informieren, wie Zeiger, Arrays und Strings funktionieren.

    – Blauchip

    13. Juni 2020 um 17:15 Uhr

1425280cookie-checkWie kann ich in C auf stderr drucken?

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

Privacy policy