Problema con l'utilizzo della funzione scanf in C

di il
6 risposte

Problema con l'utilizzo della funzione scanf in C

Salve a tutti! Allora ho scritto un codice in C la cui parte saliente è quella scritta di seguito:
char r;
printf("Oggi piove?: ");
scanf("%c",&r);
printf("\n");
printf("Oggi nevica?: ");
scanf("%c",&r);
printf("\n");
printf("Oggi grandina?: ");
scanf("%c",&r);
printf("\n");
Quando eseguo il programma ignora il secondo scanf ...
Mi spiego meglio, il programma scrive: "Oggi piove?: ", e mi da la possibilità di immettere un input, poi
scrive "Oggi nevica?: " e subito a capo "Oggi grandina:? " senza darmi la possibilità di rispondere alla seconda domanda...qualcuno sa come mai? Che ho sbagliato?
Grazie in anticipo!!

6 Risposte

  • Re: Problema con l'utilizzo della funzione scanf in C

    Lascia perdere la scanf() e sforzati di usare la fgets() così eviti questo e altri problemi
  • Re: Problema con l'utilizzo della funzione scanf in C

    Il consiglio di candaluar è ovviamente buono, però vorrei lo stesso riportare alcune mie osservazioni "empiriche" che potrebbero farti comodo. Siccome "io ci gioco, col codice, mica ci lavoro", prendi sempre con le pinze tutto quel che scrivo.

    Credo che il problema nasca dal fatto che quando "leggi" un char dallo stream di input con "%c", ricevi effettivamente il primo carattere immesso. Quand'anche quel carattere fosse l'unico immesso intenzionalmente, resterebbe il fatto che quando si dà l'invio, in coda all'input viene comunque inserito anche un '\n'. Ora, mettiamo che tu scriva, in risposta alla domanda "Oggi piove?", soltanto una 's' per indicare "sì", quindi premi invio... al tuo programma arriva la sequenza "s\n", dalla quale tu con scanf() "prelevi" la 's'. E la '\n'? Quella resta "pendente" nello stream di input, per cui quando chiedi "Oggi nevica?" e chiami nuovamente scanf(), non hai neppure il tempo di digitare una risposta, perché quell' '\n' pendente entra in gioco e provoca il ritorno immediato da scanf() (ecco perché ti compare subito l'altra domanda, "Oggi grandina?"). Avrai notato che dopo "Oggi grandina?" il programma si arresta in attesa di un nuovo input, perché non c'è più niente nello stream dal momento che la scanf() precedente ha "consumato" il '\n' pendente. E' un po' confuso, ma spero d'essere riuscito a spiegarmi.

    Anche con fgets() può succedere qualcosa di simile se "sfondi" il buffer, poiché fgets() per evitare di sovraccaricare il buffer lascia nello stream di input tutti i caratteri in eccesso. In quel caso, una successiva chiamata a fgets() finisce per accedere ai "residui" dell'immissione precedente, come nel caso di scanf().
    Per evitare questo inconveniente son solito scrivere in coda a ogni chiamata a fgets() una riga con l'istruzione...
    if( '\n' != *buffer[strlen(buffer)-1]) while( '\n' != getchar() );
    Questo, ovviamente, se il troncamento dell'input è accettabile. In caso contrario occorre agire diversamente.

    Un'altra cosa che mi ritrovo a dover fare spesso con fgets() è liberarmi del '\n' che viene aggiunto in fondo all'input. Di solito faccio così:
    size_t lStr = strlen(buffer);
    if( '\n' == buffer[lStr-1] ) buffer[--lStr] = '\0';
    Buon divertimento!
  • Re: Problema con l'utilizzo della funzione scanf in C

    Aldo sei stato chiarissimo!
    Grazie a tutti ragazzi per l'aiuto!!
  • Re: Problema con l'utilizzo della funzione scanf in C

    Ho ovviato al problema in questo modo:
    char p, r[20];
    printf("Oggi piove?: ");
    r[0]=getchar();
    p=getchar();
    printf("Oggi nevica?: ");
    r[1]=getchar();
    p=getchar();
    printf("Oggi grandina?: ");
    r[2]=getchar();
    Così funziona!!
  • Re: Problema con l'utilizzo della funzione scanf in C

    Ben lieto d'esserti stato utile. Un domani mi ricambierai il favore.

    Una curiosità... "Chef Tony" è quello che affettava pomodori e lattine con i Miracle Blades? Ma sei lui in persona? (seeeeeee....) Sto interloquendo con un personaggio leggendario!
  • Re: Problema con l'utilizzo della funzione scanf in C

Devi accedere o registrarti per scrivere nel forum
6 risposte