Imprimer pour stderr en C

Jinku Hu 12 octobre 2023
  1. Utilisez la fonction fprintf pour imprimer vers stderr en C
  2. Utilisez la fonction dprintf pour imprimer vers stderr en C
  3. Utilisez la fonction fwrite pour imprimer vers stderr en C
Imprimer pour stderr en C

Cet article présente plusieurs méthodes pour imprimer en C.

Utilisez la fonction fprintf pour imprimer vers stderr en C

La bibliothèque d’E/S standard en C fournit trois flux de texte qui sont ouverts implicitement lorsque le programme est lancé sur le système. Ces flux sont les suivants,

  • entrée standard (stdin) - utilisée pour la lecture des entrées.
  • sortie standard (stdout) - utilisée pour l’écriture de la sortie.
  • flux d’erreur standard (stderr) - utilisé pour enregistrer les messages d’erreur ou de débogage pendant l’exécution.

Afin d’imprimer des données dans ces flux, les fonctions de la famille printf sont utilisées. fprintf est généralement utilisé pour sortir du texte sur un flux de sortie spécifique. Lorsque nous devons imprimer sur stderr, nous ciblons le flux stderr et le passons comme premier argument à la fonction. Le second argument est la chaîne de format elle-même, qui fournit des moyens d’inclure différents objets dans la sortie et de construire le formatage donné. Notez que nous incluons plusieurs chaînes de caractères dans "" car elles seront automatiquement concaténées lors de la compilation.

#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);
}

Production :

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

Utilisez la fonction dprintf pour imprimer vers stderr en C

On peut aussi utiliser la fonction dprintf, qui est similaire à l’appel fprintf, sauf qu’elle prend le descripteur de fichier comme premier argument. Les descripteurs de fichiers dans les systèmes basés sur Unix sont des valeurs entières associées aux fichiers ouverts du programme.

Notez que l’en-tête standard Unix - <unistd.h> inclut des définitions de macro pour les trois flux mentionnés comme - STDIN_FILENO, STDOUT_FILENO et STDERR_FILENO. Nous définissons également deux macros - RED et NC, qui sont juste des séquences de caractères ASCII pour modifier la couleur du texte dans la sortie.

#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);
}

Production :

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

Utilisez la fonction fwrite pour imprimer vers stderr en C

Une autre alternative aux fonctions précédentes est fwrite. Elle est surtout utilisée pour les entrées/sorties de flux binaires, mais on peut toujours l’appeler pour imprimer du texte sur les flux de sortie. fwrite prend quatre arguments, et le premier d’entre eux est le pointeur vers la chaîne de caractères qui doit être imprimée. Les deux suivants spécifient la taille du nombre de données stockées au niveau du pointeur et la taille de chacune d’entre elles. Comme nous n’imprimons qu’une seule chaîne de caractères, le troisième argument peut être 1, et la taille correspond à la longueur de la chaîne. Le quatrième paramètre est le FILE* qui pointe vers le flux souhaité.

#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);
}

Production :

[ERROR] : No string argument provided!
Auteur: 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

Article connexe - C IO