Imprimir para Stderr em C

Jinku Hu 12 outubro 2023
  1. Utilize a função fprintf para imprimir para stderr em C
  2. Utilize a função dprintf para imprimir para stderr em C
  3. Utilize a função fwrite para imprimir para stderr em C
Imprimir para Stderr 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!
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

Artigo relacionado - C IO