Stampa su stderr in C
-
Usa la funzione
fprintf
per stampare sustderr
in C -
Usa la funzione
dprintf
per stampare sustderr
in C -
Usa la funzione
fwrite
per stampare sustderr
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!
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