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?
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);
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!$
-
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.
-
Aunque inicialmente tanto stdout como stderr llegan a la consola, ambos están separados y se pueden redirigir individualmente.
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.
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
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
¿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