2011-11-28 8 views
9
#include <stdio.h> 

int main() 
{ 
    char loop='y'; 
    while(loop != 'n') { 
     printf("loop? "); 
     scanf("%c", &loop); 
     if(loop != 'y') { 
      loop='n'; 
     } 
    } 
    return 0; 
} 

Se si digita "y", riavvia il ciclo while, ma ignora lo scanf la seconda volta e termina il ciclo. Qualcuno può aiutare?While-loop ignora scanf la seconda volta

+0

Controlla questo articolo: http://www.gidnetwork.com/b-60.html –

+2

possibile duplicazione di [Second scanf non funziona] (http://stackoverflow.com/questions/4023643/second-scanf -is-non-funzionante) – AShelly

+2

possibile duplicato di [Scanf salta l'altro mentre il ciclo si trova in C] (http://stackoverflow.com/questions/1669821/scanf-skips-every-other-while-loop-in-c) –

risposta

15

Assicurarsi che lo scanf scarti la nuova riga. Cambialo a:

scanf(" %c", &loop); 
    ^
+0

thx, funziona. Ma perché devo mettere uno spazio prima di% c? – user1069968

+2

@ user1069968 Questo spazio fa sì che 'scanf' ignori tutti gli spazi bianchi (incluse le nuove linee). – cnicutar

9

Probabilmente è necessario inserire una nuova riga in modo che l'input venga inviato al programma, giusto? La seconda volta che il ciclo viene eseguito, legge il carattere di nuova riga, che era "in attesa" per essere letto ed esce automaticamente dal ciclo ('\n' != 'y'). È possibile effettuare scanf ignora gli spazi bianchi utilizzando questo stringa di formato invece:

" %c" 
+0

Questa è la risposta migliore spiegata su questo thread. Grazie per aver salvato i compiti della mia ragazza! <3 –

+1

Grazie a @AustinWitherow, sono felice di sapere che ti è stato utile :) – sidyll

-1

Una soluzione può essere l'uso fflush(stdin) dopo l'istruzione scanf() per cancellare il buffer di input.

+1

'fflush (stdin)' ha un comportamento non definito nella programmazione in C. Potrebbe funzionare come previsto su alcuni sistemi, ma non è una buona pratica in generale. –

+0

@ NisseEngström Grazie Nisse, sono d'accordo con il punto. Non è una buona pratica, come possiamo vedere qui https://stackoverflow.com/questions/9122550/fflushstdin-function-does-not-work –

+0

fflush stdin funziona anche su linux ma evita di usarlo come UB, usandolo hai perso portabilità. – EsmaeelE