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.
Al ejecutar el código anterior, obtenemos como resultado el siguiente:
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.
Si realizamos este cambio y ejecutamos nuevamente el programa ocurrirá lo siguiente:
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:
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.
Espero que este artículo haya sido de ayuda, saludos y hasta un próximo tutorial, ¡comenta si te ha servido!.
Autor: Julio Marulanda.
diciembre 6, 2014 at 2:37 pm
Muchísimas gracias por la entrada, me ha sido muy útil 😀
Me gustaMe gusta
diciembre 6, 2014 at 10:37 pm
Hola Javi!, gracias por comentar, esperamos que también te resulten útiles otros artículos de este sitio.
Saludos.
Julio
Me gustaMe gusta
enero 24, 2015 at 5:19 pm
Gracias está genial
Me gustaMe gusta
enero 27, 2015 at 10:08 pm
Hola Marta!, gracias por comentar, esperamos que los próximos artículos sobre C++ y otros lenguajes te sigan siendo útiles.
Saludos.
Julio
Me gustaMe gusta
May 31, 2015 at 10:43 am
Muchas gracias, me ha sido muy útil la información que encontré acá.
Me gustaMe gusta
junio 13, 2015 at 9:24 pm
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 gustaMe gusta
junio 25, 2015 at 8:32 pm
Gracias, me sirvió.
Me gustaMe gusta
junio 26, 2015 at 4:39 pm
Gracias por tu comentario Vector, espero que puedas encontrar más contenido útil entre nuestros artículos.
Julio.
Me gustaMe gusta
agosto 18, 2015 at 1:33 pm
Gracias man me re mil sirvio
Me gustaMe gusta
agosto 18, 2015 at 1:34 pm
lo de la explicacion del buffer es lo que no podia entender ,pero aqui lo dejaste clarito, gracias
Me gustaMe gusta
septiembre 25, 2015 at 10:37 pm
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 gustaMe gusta
septiembre 26, 2015 at 4:34 pm
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 gustaMe gusta
May 27, 2016 at 11:41 am
Funcionó de maravilla, GRACIAS.
Me gustaMe gusta
noviembre 12, 2017 at 5:01 pm
Pude resolver el problema que tenia con esto, muchas gracias.
Me gustaMe gusta
abril 23, 2018 at 3:46 pm
Así es, suele ser un problema recurrente. Me alegra mucho que te haya resultado útil el artículo.
Saludos y gracias por comentar.
Me gustaMe gusta