06.05.2013 Views

CONTENIDO DE LA LECCIÓN 8

CONTENIDO DE LA LECCIÓN 8

CONTENIDO DE LA LECCIÓN 8

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

MIGUEL Á. TOLEDO MARTÍNEZ<br />

Cuándo se ejecuta este programa, parece como si C++ saltara sobre el enunciado cin.getline()<br />

¿Cómo puede ser esto? Bien, si vemos el contenido de numero y nombre esto es lo que veríamos<br />

(suponiendo que se introdujo el entero 123):<br />

numero<br />

int 123<br />

nombre<br />

[0] ‘\0’<br />

[1] ‘\0’<br />

Observe que la variable de cadena nombre tiene el terminador nulo en la posición [0] del arreglo<br />

porque cuando se escribe el número 123, se debe oprimir la tecla ENTER (¿) Esto coloca un<br />

carácter CRLF en la memoria temporal de flujo. Sin embargo, el enunciado cin>>numero no<br />

extrae el carácter CRLF (porque es un espacio en blanco) y permanece en la memoria temporal.<br />

Cuando se ejecuta el enunciado cin.getline(nombre,TAMANO), lee la memoria temporal y ve el<br />

carácter CRLF. Como el valor predeterminado del carácter delimitador es justamente CRLF, la<br />

función termina de ejecutarse y agrega el carácter terminador nulo en el arreglo. De este modo, el<br />

usuario nunca tiene la oportunidad de ingresar un nombre.<br />

Existen tres formas básicas de resolver el problema anterior. Una de ellas es especificar un<br />

carácter delimitador diferente en la función getline() Sin embargo, el usuario deberá escribir este<br />

carácter para terminar la operación, con las consecuentes molestias.<br />

Una segunda forma es limpiar la memoria temporal leyendo el carácter CRLF dentro de una<br />

variable temporal después de cualquier dato numérico o carácter y antes de leer cualquier cadena<br />

de datos. Para hacer esto, deberá definirse una variable temporal como arreglo de dos caracteres,<br />

por ejemplo, temporal[2]<br />

Después de usar cin para leer cualquier dato numérico o de un solo carácter emplearemos el<br />

enunciado cin.getline(temporal,2) para leer el caracteres CRLF restante en la memoria temporal<br />

del teclado, de esta manera se limpia la memoria temporal.<br />

Ejemplo 7.16<br />

El siguiente programa: CINGET3.CPP, modifica el programa CINGET2.CPP, empleando una<br />

variable temporal.<br />

/* El siguiente programa: CINGET3.CPP, ilustra como usar una variable temporal<br />

para limpiar la memoria temporal (buffer) del teclado, después de haber leído<br />

una variable numérica.<br />

*/<br />

#include // Para cout<br />

const int TAMANO = 31; // Define el tamaño del arreglo<br />

void main(void)<br />

{<br />

FUNDAMENTOS – <strong>LECCIÓN</strong> 7 7-21

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!