Wie kann ich in C auf stderr drucken?

119

In C ist das Drucken auf Standardausgabe mit printffrom einfach stdio.h.

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

Bündel
quelle
5
Was ist so "seltsam" an der Syntax? Es wird gedruckt, wo , wie und was .
Eugene Sh.
5
Ich konzentriere mich darauf. Das einzige Problem, das sich aus der Frage ergibt, dass Sie die Lösung "seltsam" finden. Ansonsten gibt es keine Frage. Verwenden Sie fprintf.
Eugene Sh.
@ Eugene. Ich stimme mit Ihnen ein. Ich fand es seltsam, da ich nicht wusste, dass stderr eine DATEI ist :)
wad

Antworten:

179

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

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

Damit ist fprintfes 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);
Fantastischer Mr. Fox
quelle
33

Beispiele:

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)
Paul R.
quelle
9
#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. Es ist nicht so, es ist nur so, dass der Standardpuffer noch geleert werden muss. Umgeleitete oder weitergeleitete Streams würden diese Verschachtelung natürlich nicht sehen, da sie normalerweise nur die Ausgabe von nur stdout oder nur stderr sehen würden.

  2. Obwohl anfangs sowohl stdout als auch stderr an die Konsole kommen, sind beide getrennt und können einzeln umgeleitet werden.

hasectic saif
quelle
5

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

Ich empfehle auch diese printf(und Familien-) Referenz .

Ein Programmierer
quelle
5

Wenn Sie aktuelle Codes nicht ändern möchten und nur für die Debug-Verwendung.

Fügen Sie dieses Makro hinzu:

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

Wechseln Sie stderrzu, stdoutwenn Sie einen Rollback durchführen möchten.

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

lxiange
quelle
0

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

FILE *fp;
char *of;
sprintf(of,"%s%s",text1,text2);
fp=fopen(of,'w');
fprintf(fp,"your print line");
winterli
quelle
Dies fügt den vorherigen Antworten nichts hinzu und beantwortet die Frage nicht wirklich.
Fantastischer Herr Fox
Diese sprintf () - Anweisung verursacht Speicherbeschädigung! ... Ich rate Ihnen dringend, sich über die Funktionsweise von Zeigern, Arrays und Strings zu informieren.
BlueChip