2011-11-28 28 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; 
} 

Si escribo 'y', reinicia el ciclo while pero ignora el scanf la segunda vez y termina el ciclo después de eso. ¿Alguien puede ayudar?While-loop ignora scanf la segunda vez

+0

Echa un vistazo a este artículo: http://www.gidnetwork.com/b-60.html –

+2

posible duplicado de [Second scanf no funciona] (http://stackoverflow.com/questions/4023643/second-scanf -is-not-working) – AShelly

+2

posible duplicado de [Scanf salta cada dos ciclos while en C] (http://stackoverflow.com/questions/1669821/scanf-skips-every-other-while-loop-in-c) –

Respuesta

15

Asegúrese de que scanf descarte la nueva línea. Cámbielo a:

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

thx, funciona. Pero ¿por qué tengo que poner un espacio antes de% c? – user1069968

+2

@ user1069968 Ese espacio hace que 'scanf' ignore todos los espacios en blanco (incluidas las líneas nuevas). – cnicutar

9

Probablemente haya tenido que ingresar una nueva línea para que la entrada vaya a su programa, ¿no? La segunda vez que el ciclo se ejecuta, lee ese carácter de nueva línea, que estaba "esperando" que se lea y sale automáticamente del ciclo ('\n' != 'y'). Puede hacer caso omiso de scanf espacios en blanco usando esta cadena de formato en su lugar:

" %c" 
+0

Esta es la mejor respuesta explicada en este hilo. ¡Gracias por salvarme la tarea de mis novias! <3 –

+1

Gracias a @AustinWitherow, me complace saber que fue útil para usted :) – sidyll

-1

Una solución puede ser el uso fflush(stdin) después de la declaración scanf() para borrar el búfer de entrada.

+1

'fflush (stdin)' tiene un comportamiento indefinido en la programación C. Puede funcionar como se pretende en algunos sistemas, pero no es una buena práctica en general. –

+0

@ NisseEngström Gracias Nisse, estoy de acuerdo con su punto. No es una buena práctica, ya que podemos ver aquí https://stackoverflow.com/questions/9122550/fflushstdin-function-does-not-work –

+0

fflush stdin también funciona en Linux, pero evita usarlo es su UB, al usarlo te perdiste portabilidad. – EsmaeelE

Cuestiones relacionadas