¿Cómo puedo imprimir con un error estándar en C con ‘printf’?

4 minutos de lectura

avatar de usuario de wad
taco

En C, imprimiendo a salida estándar (stdout) es fácil, con printf de stdio.h.

Sin embargo, ¿cómo puedo imprimir en Error estándar (stder)? Nosotros podemos usar fprintf para lograrlo aparentemente, pero su sintaxis parece extraña. Tal vez podamos usar printf para imprimir a error estándar?

  • ¿Qué tiene de “extraño” su sintaxis? es imprimir dónde, cómo y qué.

    – Eugenio Sh.

    17 de agosto de 2016 a las 16:42


  • Me estoy enfocando en eso. El único problema que surge de la pregunta es que encuentra la solución “extraña”. De lo contrario, no hay duda. Usar fprintf.

    – Eugenio Sh.

    17 de agosto de 2016 a las 16:46


  • @Eugene. Estoy de acuerdo con usted. Pensé que era extraño porque no me di cuenta de que stderr es un ARCHIVO 🙂

    – taco

    17 de agosto de 2016 a las 16:49


  • @Schilive Gracias por avisarme, también eliminé el mío ahora.

    – Por Lundberg

    8 abr a las 15:04

Fantástico avatar de usuario de Mr Fox
fantástico señor zorro

La sintaxis es casi la misma que printf. Con printf le das el formato de cadena y su contenido, es decir:

printf("my %s has %d chars\n", "string format", 30);

Con fprintf es lo mismo, excepto que ahora también está especificando el lugar para imprimir:

FILE *myFile;
...
fprintf(myFile, "my %s has %d chars\n", "string format", 30);

O en tu caso:

fprintf(stderr, "my %s has %d chars\n", "string format", 30);

Avatar de usuario de Paul R
pablo r

Algunos ejemplos de salida formateada a stdout y stderr:

printf("%s", "Hello world\n");              // "Hello world" on stdout (using printf)
fprintf(stdout, "%s", "Hello world\n");     // "Hello world" on stdout (using fprintf)
fprintf(stderr, "%s", "Stack overflow!\n"); // Error message on stderr (using fprintf)

#include<stdio.h>

int main ( ) {
    printf( "hello " );
    fprintf( stderr, "HELP!" );
    printf( " world\n" );
    return 0;
}

$ ./a.exe
HELP!hello  world
$ ./a.exe 2> tmp1
hello  world
$ ./a.exe 1> tmp1
HELP!$
  1. stderr generalmente no tiene búfer y stdout generalmente lo es. Esto puede conducir a un resultado de aspecto extraño como este, lo que sugiere que el código se está ejecutando en el orden incorrecto. No lo es, es solo que el búfer de salida estándar aún no se ha vaciado. Los flujos redirigidos o canalizados, por supuesto, no verían esta intercalación, ya que normalmente solo verían la salida de stdout o stderr.

  2. Aunque inicialmente tanto stdout como stderr llegan a la consola, ambos están separados y se pueden redirigir individualmente.

avatar de usuario de lxiange
lxiang

Si no desea modificar el código actual y solo para el uso de depuración.

Agrega esta macro:

#define printf(args...) fprintf(stderr, ##args)
// Under GCC

#define printf(args...) fprintf(stderr, __VA_ARGS__)
// Under MSVC

Cambiar stderr a stdout si quieres retroceder.

Es útil para la depuración, pero no es una buena práctica.

El avatar de usuario de un tipo programador
Un tipo programador

Deberias saber sprintf. Es básicamente lo mismo con fprintf. El primer argumento es el destino (el archivo en el caso de fprintf es decir stderr), el segundo argumento es la cadena de formato y el resto son los argumentos habituales.

yo tambien recomiendo este printf (y familia) referencia.

  • Esto no está relacionado con el OP y está redactado de manera confusa. sprintf “imprimirá” en una cadena y no puede imprimir en stderr.

    – David Ljung Madison Estelar

    22 de septiembre de 2020 a las 0:27

Por alguna razón, nadie ha mencionado eprintf() sin embargo, que es lo mismo que fprintf(stderr, ...).

eprintf("ERROR: You have caused an error!!1!");

Sugerencia rápida: si está utilizando stderr para la depuración, puede usar el __LINE__ macro

#define printfError(str, ...) eprintf("ERROR at line " #__LINE__ ": " str, __VA_ARGS__)

printfError("Division by zero"); // "ERROR at line 2: Division by zero

  • Esto no está relacionado con el OP y está redactado de manera confusa. sprintf “imprimirá” en una cadena y no puede imprimir en stderr.

    – David Ljung Madison Estelar

    22 de septiembre de 2020 a las 0:27

Avatar de usuario de Peter Mortensen
Pedro Mortensen

Para imprimir su contexto, puede escribir un código como este:

FILE *fp;
char *of;
sprintf(of, "%s%s", text1, text2);
fp = fopen(of, 'w');
fprintf(fp, "your print line");

  • Esto no agrega nada a las respuestas anteriores y realmente no responde la pregunta.

    – Fantástico Sr. Zorro

    30 de abril de 2019 a las 8:43

  • ¡Esa instrucción sprintf() causa daños en la memoria! …Le recomiendo encarecidamente que lea cómo funcionan los punteros, las matrices y las cadenas.

    – BlueChip

    13 de junio de 2020 a las 17:15

¿Ha sido útil esta solución?