Imprimir para Stderr em C
-
Utilize a função
fprintf
para imprimir parastderr
em C -
Utilize a função
dprintf
para imprimir parastderr
em C -
Utilize a função
fwrite
para imprimir parastderr
em C
Este artigo irá introduzir múltiplos métodos sobre como imprimir para stderr em C.
Utilize a função fprintf
para imprimir para stderr
em C
A biblioteca I/O padrão em C fornece três fluxos de texto que são abertos implicitamente quando o programa é iniciado no sistema. Estes fluxos são,
- entrada padrão (
stdin
) - utilizada para a leitura da entrada. - saída padrão (
stdout
) - utilizada para a escrita de saída. - standard error stream (
stderr
) - utilizado para registar mensagens de erro ou debug durante o tempo de execução.
A fim de imprimir dados para estes fluxos, são utilizadas funções da família printf
. O fprintf
é normalmente utilizado para imprimir texto para um fluxo de saída específico. Quando precisamos de imprimir para stderr
, estamos a apontar para o fluxo stderr
e a passá-lo como o primeiro argumento para a função. O segundo argumento é a própria string de formatação, que fornece meios para incluir diferentes objectos na saída e construir a formatação dada. Note-se que incluímos várias strings em ""
pois elas serão automaticamente concatenadas durante a compilação.
#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);
}
Resultado:
[ERROR]: No string argument provided!
You must provide a program path as argument
Utilize a função dprintf
para imprimir para stderr
em C
Em alternativa, podemos utilizar a função dprintf
, que é semelhante à chamada fprintf
, excepto que toma o descritor de ficheiro como primeiro argumento. Os descritores de ficheiros em sistemas baseados em Unix são valores inteiros associados aos ficheiros abertos do programa.
Note-se que, o cabeçalho padrão Unix - <unistd.h>
inclui definições de macro para estes três fluxos mencionados como - STDIN_FILENO
, STDOUT_FILENO
e STDERR_FILENO
. Definimos também duas macros - RED
e NC
, que são apenas sequências de caracteres ASCII para modificar a cor do texto na saída.
#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);
}
Resultado:
[ERROR]: No string argument provided!
You must provide a program path as argument
Utilize a função fwrite
para imprimir para stderr
em C
Outra alternativa às funções anteriores é fwrite
. É principalmente utilizada para I/O de fluxo binário, mas ainda podemos chamá-lo para imprimir texto para fluxos de saída. A função fwrite
aceita quatro argumentos, e o primeiro deles é o ponteiro para a string que precisa de ser impressa. Os dois parâmetros seguintes especificam o tamanho do número de itens de dados armazenados no ponteiro e o tamanho de cada um deles. Uma vez que imprimimos uma única string, o terceiro argumento pode ser 1
, e o tamanho corresponde ao comprimento da string. O quarto parâmetro é o FILE*
que aponta para o fluxo desejado.
#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);
}
Resultado:
[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