Limpiar el Buffer del Teclado en C++ (Entrada estandar)

Cuando realizamos programas de ‘terminal’ o ‘consola’, muchas veces necesitamos ingresar datos a través de esta, sin embargo nos encontramos con comportamientos inesperados, un programa sencillo que muestra un comportamiento normal, es el siguiente, donde se pide a una persona ingresar su nombre y luego su edad y estos datos se muestran nuevamente en la consola.

cpp1

Al ejecutar el código anterior, obtenemos como resultado el siguiente:

consola1

Y como habíamos mencionado el comportamiento es el esperado, sin embargo, ¿qué pasa sin invertimos le orden en que son ingresados los datos, es decir, que pasa si primero ingreso un número y luego una cadena?, como se muestra en el siguiente código.

cpp2

Si realizamos este cambio y ejecutamos nuevamente el programa ocurrirá lo siguiente:

consola2

Como se puede ver, el programa no me ha permitido ingresar el nombre (¿te ha pasado?). Esto no es un error del compilador, es un error nuestro al no hacer un buen manejo del buffer y limpiarlo antes de ingresar un datos de tipo ‘caracter’ o ‘cadena de caracteres’ (string), cuando se ingresa por el teclado un valor numérico y se presiona la tecla ‘enter’ esta a su vez ingresa el caracter de fin de cadena ‘\n’ y como los valores numéricos los leemos con el método cin>> que es el que extrae del flujo de entrada, lee el valor numérico y descarta el caracter ‘\n’ lo que quiere decir que este permanecerá en el buffer hasta una nueva lectura, y cuando vayamos a leer el datos “nombre” del programa, la función getline() tomará el primer caracter que encuentre, en este caso ‘\n’ y lo que tendremos será una cadena vacía, y el programa continuara su ejecución, como se vio en la figura anterior.

¿Cómo evito que eso pase?

este ligero inconveniente se puede evitar limpiando el buffer de entrada estándar con el método cin.ignore() el cual por defecto borra el primer caracter que encuentra en el buffer (normalmente ‘\n’). Otra forma, es pasando al mismo método dos parámetros, que son la cantidad de caracteres que serán borrados (máximo 256), y el caracter en el cual terminará el borrado, para nuestro caso ‘\n’. Lo anterior lo ilustramos en la linea 14 a continuación:

cpp3

Si ahora compilamos y ejecutamos el código anterior el resultado será un comportamiento adecuado, permitiéndome ingresar una cadena normalmente después de haber ingresado cualquier valor numérico, como se puede ver a continuación.

consola3

Espero que este artículo haya sido de ayuda, saludos y hasta un próximo tutorial, ¡comenta si te ha servido!.

Autor: Julio Marulanda.

14 comentarios en “Limpiar el Buffer del Teclado en C++ (Entrada estandar)

  1. Pingback: El Tipo String y sus Métodos más Importantes en C++ | El Blog de Programación para Ingenierías

    • Gracias por tu comentario Gabriel, esperamos poder seguir publicando contenido que te resulte útil, y si crees que la información le puede ser útil a alguien más, ayúdanos a seguir compartiendo.

      Saludos.
      Julio

      Me gusta

  2. Hola Julio, muy interesante, no sabía que podría pasar.
    Ahora, resulta que me pasa algo parecido cuando quiero tomar una cadena con la función scanf, y si separo la cadena con un espacio, obtengo un efecto parecido. ¿de casualidad sabes porque el suceso?
    xD

    Me gusta

    • Hola Harvy, si, eso es normal porque la función scanf() está definida solo para leer una cadena hasta que encontra un espacio, y luego el resto queda ahí en el buffer…entonces si estás trabajando con cadenas, la recomendación para no tener esos inconvenientes, es hacer uso del método getline(). como lo puedes ver en la linea 17 del último código que pusimos en el artículo donde se pregunta el nombre de una persona.

      Saludos.

      Me gusta

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s