Autor Tema: scanf C no se detiene en un bucle while y salta la condición  (Leído 9547 veces)

manuromero73

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 40
    • Ver Perfil
Hola, le he dado muchas vueltas y no acabo de entender lo que ocurre con este codigo, se supone que en cada bucle tiene que pedir si se quiere continuar o no, pero en vez de permitirme introducir la respuesta después de haber dicho que se quiere continuar, termina el programa sin esperar a que se entre la respuesta ¿por qué y como lo soluciono? gracias por su ayuda

Código: [Seleccionar]
#include <stdio.h>
#include <stdlib.h>

int main() {
    char respuesta = 's';
    while (respuesta=='s' || respuesta=='S') {
        printf("Dime si quieres continuar (S/N): ");
        scanf("%c", &respuesta);
    }
    printf("Has salido del bucle");

    return 0;
}
« Última modificación: 04 de Agosto 2014, 14:15 por César Krall »

dongo

  • Intermedio
  • ***
  • Mensajes: 177
    • Ver Perfil
Re:scanf no se detiene en un bucle while y salta la condición
« Respuesta #1 en: 04 de Agosto 2014, 13:19 »
jajajaja me acuerdo de mis inicios con C me paso igual y también me tire un rato dando vueltas... jajaja.

Simplemente, pon un espacio delante de %c en el scanf así:

Código: [Seleccionar]
scanf(" %c", &respuesta);

Esto es debido a como c realiza la conversión, No se muy bien a que es debido, pero tiene que ver con el contenido del buffer de entrada del teclado, al poner un espacio delante c, se salta el carácter que hay en el buffer y ya coge el nuevo carácter introducido. Mas o menos...

A ver si alguien nos lo aclara mejor. el caso es que cuando vas a leer caracteres por teclado con la función scanf hay que dejar un caracter en blanco delante del formato de conversión %c.

Te encontrarás con muchas cosas de este tipo en c, no te desesperes, y siempre que no te funcione algo, haz algún debug, si tras la inserción del carácter hubieras echo un printf del carácter capturado, te habrías dado cuenta que no estaba capturando el caracter 's' , sino que estaba cogiendo el que tenia en el buffer.

Bueno un saludo y a darle caña que ya no hay muchos valientes que se atrevan con C, jaja.

César Krall

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2078
  • No vales por lo que dices, sino por lo que haces
    • Ver Perfil
    • aprenderaprogramar.com
Re:scanf no se detiene en un bucle while y salta la condición
« Respuesta #2 en: 04 de Agosto 2014, 14:14 »
Hola, abundando en el tema tal y como comenta dongo es un problema con el buffer de entrada de C que raramente te encontrarás en otros lenguajes... Al ejecutar scanf se almacena en el buffer la entrada previa al caracter oculto salto de línea, pero el salto de línea se queda en el buffer y en la siguiente iteración del bucle es leído directamente sin que te permita la introducción de respuesta, de ahí que termine el bucle.

Una alternativa es usar lo siguiente: scanf("%c%*c", &respuesta);

De esta manera, el segundo carácter (el salto de línea) no es almacenado en el buffer, con lo cual a la repetición del bucle ya no se encuentra que haya nada almacenado y te pide el carácter.

Si piensas que es un poco extraño efectivamente lo es  :-\

Responsable de departamento de producción aprenderaprogramar.com

manuromero73

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 40
    • Ver Perfil
Re:scanf C no se detiene en un bucle while y salta la condición
« Respuesta #3 en: 04 de Agosto 2014, 17:51 »
Gracias a los dos! De las dos maneras funciona y ya me estaba volviendo loco  :-[

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".