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 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);
Paul R
Einige Beispiele für die formatierte Ausgabe an stdout und stderr:
#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!$
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.
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.
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.
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
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
Winterli
Um Ihren Kontext zu drucken, können Sie Code wie diesen schreiben:
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
14252800cookie-checkWie kann ich in C auf stderr drucken?yes
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