Stampa su stderr in C

Jinku Hu 12 ottobre 2023
  1. Usa la funzione fprintf per stampare su stderr in C
  2. Usa la funzione dprintf per stampare su stderr in C
  3. Usa la funzione fwrite per stampare su stderr in C
Stampa su stderr in C

Questo articolo introdurrà più metodi su come stampare su stderr in C.

Usa la funzione fprintf per stampare su stderr in C

La libreria I/O standard in C fornisce tre flussi di testo che vengono aperti implicitamente all’avvio del programma sul sistema. Questi flussi sono,

  • input standard (stdin) - usato per leggere l’input.
  • output standard (stdout) - usato per scrivere l’output.
  • flusso di errore standard (stderr) - utilizzato per registrare errori o eseguire il debug dei messaggi durante l’esecuzione.

Per stampare i dati su questi flussi, vengono utilizzate le funzioni della famiglia printf. fprintf viene solitamente impiegato per inviare del testo a uno specifico flusso di output. Quando abbiamo bisogno di stampare su stderr, stiamo prendendo di mira il flusso stderr e lo passiamo come primo argomento alla funzione. Il secondo argomento è la stringa di formato stessa, che fornisce i mezzi per includere diversi oggetti nell’output e costruire la formattazione data. Nota che includiamo più stringhe in "" poiché verranno automaticamente concatenate durante la compilazione.

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

Produzione:

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

Usa la funzione dprintf per stampare su stderr in C

In alternativa, possiamo usare la funzione dprintf, che è simile alla chiamata fprintf, tranne per il fatto che prende il descrittore di file come primo argomento. I descrittori di file nei sistemi basati su Unix sono valori interi associati ai file aperti del programma.

Notare che, l’intestazione Unix standard - <unistd.h> include le definizioni delle macro per questi tre flussi citati come - STDIN_FILENO, STDOUT_FILENO e STDERR_FILENO. Definiamo anche due macro - RED e NC, che sono solo sequenze di caratteri ASCII per modificare il colore del testo nell’output.

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

Produzione:

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

Usa la funzione fwrite per stampare su stderr in C

Un’altra alternativa alle funzioni precedenti è fwrite. Viene utilizzato principalmente per I/O di flussi binari, ma possiamo ancora chiamarlo per stampare il testo nei flussi di output. fwrite richiede quattro argomenti, e il primo di essi è il puntatore alla stringa che deve essere stampata. I due parametri successivi specificano la dimensione del numero di elementi di dati memorizzati nel puntatore e la dimensione di ciascuno di essi. Poiché stampiamo una singola stringa, il terzo argomento può essere 1 e la dimensione corrisponde alla lunghezza della stringa. Il quarto parametro è il FILE* che punta al flusso desiderato.

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

Produzione:

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

Articolo correlato - C IO