Come posso stampare su stderr in C?


120

In C, stampare su stdout è facile, con printffrom stdio.h.

Tuttavia, come posso stampare su stderr? Possiamo usarlo fprintfper ottenerlo apparentemente, ma la sua sintassi sembra strana. Forse possiamo usare printfper stampare su stderr?


5
Cosa c'è di così "strano" nella sua sintassi? Stampa dove , come e cosa .
Eugene Sh.

5
Mi sto concentrando su questo. L'unico problema che nasce dalla domanda, che trovi la soluzione "strana". Altrimenti non ci sono dubbi. Usa fprintf.
Eugene Sh.

@Eugene. Sono d'accordo con te. Ho pensato che fosse strano perché non mi rendevo conto che stderr è un FILE :)
wad

Risposte:


179

La sintassi è quasi la stessa di printf. Con printftu dai il formato della stringa e il suo contenuto, ad esempio:

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

Con fprintfesso è lo stesso, tranne che ora stai anche specificando il luogo in cui stampare:

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

O nel tuo caso:

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

34

Esempi:

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)

9
#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 è solitamente senza buffer e stdout solitamente lo è. Ciò può portare a un output dall'aspetto strano come questo, che suggerisce che il codice viene eseguito nell'ordine sbagliato. Non lo è, è solo che il buffer stdout deve ancora essere scaricato. I flussi reindirizzati o reindirizzati ovviamente non vedrebbero questo interleave poiché normalmente vedrebbero solo l'output di stdout o solo di stderr.

  2. Sebbene inizialmente sia stdout che stderr arrivino alla console, entrambi sono separati e possono essere reindirizzati individualmente.



5

Se non vuoi modificare i codici correnti e solo per il debug.

Aggiungi questa macro:

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

Cambia stderrin stdoutse vuoi tornare indietro.

È utile per il debug, ma non è una buona pratica.


0

Per stampare il tuo contesto, puoi scrivere codice come questo:

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

Questo non aggiunge nulla alle risposte precedenti e non risponde realmente alla domanda.
Fantastico Mr Fox,

Quell'istruzione sprintf () causa il danneggiamento della memoria! ... Consiglio vivamente di leggere come funzionano i puntatori, gli array e le stringhe.
BlueChip
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.