Scanf . funzionamento super base

di il
3 risposte

Scanf . funzionamento super base

Ciao a tutti,

avevo iniziato a studiare C per un esame, poi l'ho un pò abbandonato, mentre
adesso vorrei riprenderlo per approfondire. Nel fare i primi esercizi di ripasso
mi sono imbattuto in una situazione di questo tipo:

scrivevo:

int main()
{
int eta;
char sesso;

printf("Digita età: ");
scanf( "%d", &eta);

printf("\n Digita il sesso: \n M se maschio:\n F se femmina\n");
scanf( "%c", &sesso);

if((sesso == 'M') || (sesso == 'm')) printf(" Sei un maschietto di %d anni", eta);
else printf(" Sei una femminuccia di %d anni", eta);

....
pensavo che la funzione scanf attendesse l'inserimento da tastiera di M o F,
mentre invece, non mi da il tempo e chiude subito con l'opzione prevista dall'else.

Se invece inverto i printf, tutto funziona regolarmente:

int main()
{
int eta;
char sesso;

printf("\n Digita il sesso: \n M se maschio:\n F se femmina\n");
scanf( "%c", &sesso);

printf("Digita età: ");
scanf( "%d", &eta);

if((sesso == 'M') || (sesso == 'm')) printf(" Sei un maschietto di %d anni", eta);
else printf(" Sei una femminuccia di %d anni", eta);

Sò che i + si divertiranno nel leggere le mie osservazioni, ma come dicevo ero convinto
che scanf attendesse la stringa di input da tastiera, invece debuggando ho visto che "salta"
l'ultimo scanf e passa immediatamente all'if che non essendo verificato entra nell'else.

Perchè succede ?
C'è un modo per "imporre" l'attesa ?

Grazie

3 Risposte

  • Re: Scanf . funzionamento super base

    Quando esegui lo scanf di un char devi aggiungere la riga fflush ( stdin ); prima di esso.
    è un'istruzione che serve per liberare il buffer della tastiera: ciò che digiti nel tuo programma viene salvato in una memoria, il buffer appunto, e chiamando la funzione fflush vai a pulire questa memoria.
  • Re: Scanf . funzionamento super base

    Prima di usare lo scanf cerca di pulire il buffer di input con
    void
    clear (void)
    {    
      while ( getchar() != '\n' );
    }
    Il tuo scanf salta nel primo caso perche il buffer in input è ancora sporco dal \n dell'input precedente.
  • Re: Scanf . funzionamento super base

    Ottimo, chiari ed esaustivi !!! Gentilissimi.

    Grazie.
Devi accedere o registrarti per scrivere nel forum
3 risposte