Newsgroup: it.comp.lang.c
Titolo: un'occhiata a questa funzione..!

void inserimento(){
    FILE *pf;
    char nome[80];
    int codice_a, modifica, num;
/* Apro il file per iserire i dati */
    if((pf=fopen("elenco", "a"))==NULL){
        printf("Errore in apertura file");
        exit(1);
        }
    printf("Inserire il nome e il numero: ");
    fscanf(stdin, "%s %d %d %d", &nome, &codice_a, &modifica, &num);
    fscanf(stdin, "%*c"); /* toglie CR dal canale d'ingresso */
/* scrive nel file */
    printf("%d", fprintf(pf, "%s %d %d %d\n", nome, codice_a, modifica,
num));
    fclose(pf);
    }
Quello che non riesco a capire č perchč, a che scopo viene iserita la
funzione:
fscanf(stdin, "%*c"); /* toglie il carriage return dal canale d'ingresso */
cosa si ottiene togliendo il CR?????
Mr_G_

cosa si ottiene togliendo il CR?????
Elimina il carattere '\n' dall'input.
Il termine "carriage return" e' una vecchia espressione per riferirsi al
carattere "a capo", in quanto identifica il ritorno del carrello che sulle ormai
antiquate periferiche TTY serviva per scrivere l'output.
Andrea Laforgia
----
I guai ve li andate a cercare : 
quando Bill Gates annuncio' che avrebbe fatto scrivere 
Windows98 a Topo Gigio perche' non gli avete creduto ?

 
Nell'esmpio non dovrebbe servire a niente. In generale permette di togliere
il CR (ENTER) pendente nel buffer di input (che non e' stato letto con la
scanf() precedente). Se non lo togli un eventuale getchar() o gets()
successiva ritornera' immediatamente (legge il CR) invece di aspettare
l'input dell'utente. Prova ad aggiungere subito dopo una semplice getchar()
(magari preceduta da una printf("Premi ENTER per continuare:");) e
confronta il comportamento con e senza la fscanf incriminata.
In realta', se lo scopo e' effettivamente questo, la scanf("%*c") non
funziona molto bene in quanto l'utente potrebbe aver inserito altri
caratteri in coda all'input (per esempio uno spazio). La soluzione giusta
e':
while(getchar()!='\n');
A me la scanf() (fscnaf() da sdtin) non piace per niente perche' ci si
incasina sempre con i CR e non c'e' controllo sull'overflow dell'input
(cosa succede se inserisco un nome troppo lungo ?).
Uso sempre:
fgets(buffer, sizeof(buffer), stdin);
e poi processo buffer con sscanf() o altro. Il problema del CR "pending" si
presenta anche in questo caso (se la linea e' piu' lunga di sizeof(buffer)
caratteri) e deve essere risolto come segue:
if (strrchr(buffer, '\n')==0))	// non c'e' il fine riga
  {
    int i=0;
    while(getchar()!='\n')
      i++;	// svuota il buffer
    if (i>0)				// Segnala solo se non e' rimasto solo il CR
      printf("Attenzione: Input troncato (%d caratteri rimossi)!\n", i);
  }

cosa si ottiene togliendo il CR?????
Purtroppo la scanf e' una brutta bestia!
Prova ad inserire questa funzione in un loop e scoprirai da solo la
risposta.
Vabbe' te la dico lo stesso: il problema si verifica solo se ripeti la
chiamata a questa funzione. Devi sapere che scanf( "%d" ) ferma la sua
scansione dell'input al primo carattere che non riesce ad interpretare come
valido per il tipo int, lasciandolo pronto nel buffer per l'input seguente,
questo vuol dire che se tu riesegui quella scanf, il '\n' finale finisce
come primo carattere per il "%s", e dal momento che possono esistere
stringhe lunghe zero viene accettato come valido per la variabile 'nome', e
quindi ecco a cosa serve fscanf( stdin,"%*c" ).
Ma e' lo stesso sbagliata: prova a dare come input questi dati:
pippo 1 2 3a\n
pluto 4 5 6\n
si c'e' una 'a' dopo il 3, il prossimo input sara' di nuovo sbagliato
perche' la fscanf(stdin,"%*c") ha levato il carattere 'a' e non il newline!
quindi l'intera linea pluto non sara' acquisita.
ciao
donCiccio