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.

Anuncios