Drucken auf stderr in C

Jinku Hu 12 Oktober 2023
  1. Verwendung von die Funktion fprintf zum Drucken auf stderr in C
  2. Verwenden Sie die Funktion dprintf, um in C nach stderr zu drucken
  3. Verwendung von die Funktion fwrite für die Ausgabe in stderr in C
Drucken auf stderr in C

Dieser Artikel stellt mehrere Methoden vor, wie man in C auf stderr drucken kann.

Verwendung von die Funktion fprintf zum Drucken auf stderr in C

Die Standard-E/A-Bibliothek in C stellt drei Text-Streams zur Verfügung, die implizit geöffnet werden, wenn das Programm im System gestartet wird. Diese Ströme sind,

  • Standardeingabe (stdin) - wird zum Lesen von Eingaben verwendet.
  • Standardausgabe (stdout) - wird zum Schreiben von Ausgaben verwendet.
  • Standard-Fehlerstrom (stderr) - wird verwendet, um Fehler- oder Debug-Meldungen während der Laufzeit zu protokollieren.

Um Daten in diese Ströme zu drucken, werden die Funktionen der printf-Familie verwendet. fprintf wird normalerweise verwendet, um Text in einen bestimmten Ausgabestrom auszugeben. Wenn wir in stderr drucken müssen, zielen wir auf den Stream stderr und übergeben ihn als erstes Argument an die Funktion. Das zweite Argument ist die Formatzeichenkette selbst, die Mittel bereitstellt, um verschiedene Objekte in die Ausgabe einzuschließen und die gegebene Formatierung zu konstruieren. Beachten Sie, dass wir mehrere Zeichenketten in "" einschließen, da sie bei der Kompilierung automatisch konkateniert werden.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#define RED "\e[0;31m"
#define NC "\e[0m"

int main(int argc, char *argv[]) {
  if (argc != 2) {
    fprintf(stderr, RED "[ERROR]" NC
                        ": No string argument provided! \n"
                        "You must provide a program path as argument\n");
    exit(EXIT_FAILURE);
  }

  char *str = malloc(strlen(argv[1]) + 1);
  strcpy(str, argv[1]);

  printf("str: %s\n", str);

  free(str);
  exit(EXIT_SUCCESS);
}

Ausgabe:

[ERROR]: No string argument provided!
You must provide a program path as argument

Verwenden Sie die Funktion dprintf, um in C nach stderr zu drucken

Alternativ können wir die Funktion dprintf verwenden, die dem Aufruf von fprintf ähnlich ist, mit dem Unterschied, dass sie den Dateideskriptor als erstes Argument annimmt. Dateideskriptoren in Unix-basierten Systemen sind Integer-Werte, die mit den offenen Dateien des Programms verknüpft sind.

Beachten Sie, dass der Standard-Unix-Header - <unistd.h> Makro-Definitionen für diese drei erwähnten Ströme enthält - STDIN_FILENO, STDOUT_FILENO und STDERR_FILENO. Wir definieren auch zwei Makros - RED und NC, die einfach ASCII-Zeichenketten sind, um die Textfarbe in der Ausgabe zu ändern.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#define RED "\e[0;31m"
#define NC "\e[0m"

int main(int argc, char *argv[]) {
  if (argc != 2) {
    dprintf(STDERR_FILENO, RED "[ERROR]" NC
                               ": No string argument provided! \n"
                               "You must provide a program path as argument\n");
    exit(EXIT_FAILURE);
  }

  char *str = malloc(strlen(argv[1]) + 1);
  strcpy(str, argv[1]);

  printf("str: %s\n", str);

  free(str);
  exit(EXIT_SUCCESS);
}

Ausgabe:

[ERROR]: No string argument provided!
You must provide a program path as argument

Verwendung von die Funktion fwrite für die Ausgabe in stderr in C

Eine weitere Alternative zu den vorherigen Funktionen ist fwrite. Sie wird meist für binäre Stream-E/A verwendet, aber wir können sie auch aufrufen, um Text in Ausgabeströme zu drucken. fwrite nimmt vier Argumente entgegen, wobei das erste der Zeiger auf die zu druckende Zeichenkette ist. Die nächsten beiden Parameter geben die Anzahl der Datenelemente an, die am Zeiger gespeichert sind, sowie die Größe der einzelnen Datenelemente. Da wir eine einzelne Zeichenkette drucken, kann das dritte Argument 1 sein, und die Größe entspricht der Länge der Zeichenkette. Der vierte Parameter ist die FILE*, die auf den gewünschten Stream zeigt.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#define RED "\e[0;31m"
#define NC "\e[0m"

int main(int argc, char *argv[]) {
  if (argc != 2) {
    fwrite("[ERROR] : No string argument provided!\n", 39, 1, stderr);
    exit(EXIT_FAILURE);
  }

  char *str = malloc(strlen(argv[1]) + 1);
  strcpy(str, argv[1]);

  printf("str: %s\n", str);

  free(str);
  exit(EXIT_SUCCESS);
}

Ausgabe:

[ERROR] : No string argument provided!
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Verwandter Artikel - C IO