CONTENIDO DE LA LECCIÓN 8
CONTENIDO DE LA LECCIÓN 8 CONTENIDO DE LA LECCIÓN 8
MIGUEL Á. TOLEDO MARTÍNEZ Primero observe que cada una de las cadenas se han definido como un arreglo de caracteres. Se ha definido cada longitud de los arreglos para que sea un carácter más grande que lo necesario. Esto es para dejar espacio para el carácter del terminador nulo ‘\0’. UN POSIBLE PROBLEMA CUANDO SE USA getline() Aunque getline() trabaja cuando se leen cadenas de caracteres en forma consecutiva, tendrá problemas al tratar de usarla para leer una cadena de caracteres después de haber usado cin para leer una variable de tipo carácter o una variable numérica. Ejemplo 7.15 cout
MIGUEL Á. TOLEDO MARTÍNEZ Cuándo se ejecuta este programa, parece como si C++ saltara sobre el enunciado cin.getline() ¿Cómo puede ser esto? Bien, si vemos el contenido de numero y nombre esto es lo que veríamos (suponiendo que se introdujo el entero 123): numero int 123 nombre [0] ‘\0’ [1] ‘\0’ Observe que la variable de cadena nombre tiene el terminador nulo en la posición [0] del arreglo porque cuando se escribe el número 123, se debe oprimir la tecla ENTER (¿) Esto coloca un carácter CRLF en la memoria temporal de flujo. Sin embargo, el enunciado cin>>numero no extrae el carácter CRLF (porque es un espacio en blanco) y permanece en la memoria temporal. Cuando se ejecuta el enunciado cin.getline(nombre,TAMANO), lee la memoria temporal y ve el carácter CRLF. Como el valor predeterminado del carácter delimitador es justamente CRLF, la función termina de ejecutarse y agrega el carácter terminador nulo en el arreglo. De este modo, el usuario nunca tiene la oportunidad de ingresar un nombre. Existen tres formas básicas de resolver el problema anterior. Una de ellas es especificar un carácter delimitador diferente en la función getline() Sin embargo, el usuario deberá escribir este carácter para terminar la operación, con las consecuentes molestias. Una segunda forma es limpiar la memoria temporal leyendo el carácter CRLF dentro de una variable temporal después de cualquier dato numérico o carácter y antes de leer cualquier cadena de datos. Para hacer esto, deberá definirse una variable temporal como arreglo de dos caracteres, por ejemplo, temporal[2] Después de usar cin para leer cualquier dato numérico o de un solo carácter emplearemos el enunciado cin.getline(temporal,2) para leer el caracteres CRLF restante en la memoria temporal del teclado, de esta manera se limpia la memoria temporal. Ejemplo 7.16 El siguiente programa: CINGET3.CPP, modifica el programa CINGET2.CPP, empleando una variable temporal. /* El siguiente programa: CINGET3.CPP, ilustra como usar una variable temporal para limpiar la memoria temporal (buffer) del teclado, después de haber leído una variable numérica. */ #include // Para cout const int TAMANO = 31; // Define el tamaño del arreglo void main(void) { FUNDAMENTOS – LECCIÓN 7 7-21
- Page 1 and 2: MIGUEL Á. TOLEDO MARTÍNEZ CONTENI
- Page 3 and 4: MIGUEL Á. TOLEDO MARTÍNEZ LECCIÓ
- Page 5 and 6: MIGUEL Á. TOLEDO MARTÍNEZ introdu
- Page 7 and 8: MIGUEL Á. TOLEDO MARTÍNEZ /* El s
- Page 9 and 10: MIGUEL Á. TOLEDO MARTÍNEZ 2, las
- Page 11 and 12: MIGUEL Á. TOLEDO MARTÍNEZ El prog
- Page 13 and 14: MIGUEL Á. TOLEDO MARTÍNEZ caso co
- Page 15 and 16: MIGUEL Á. TOLEDO MARTÍNEZ una fun
- Page 17 and 18: MIGUEL Á. TOLEDO MARTÍNEZ . [30]
- Page 19: MIGUEL Á. TOLEDO MARTÍNEZ [5] ‘
- Page 23 and 24: MIGUEL Á. TOLEDO MARTÍNEZ USO DE
- Page 25 and 26: MIGUEL Á. TOLEDO MARTÍNEZ LAS FUN
- Page 27 and 28: MIGUEL Á. TOLEDO MARTÍNEZ Miguel
- Page 29 and 30: MIGUEL Á. TOLEDO MARTÍNEZ CLASES:
- Page 31 and 32: MIGUEL Á. TOLEDO MARTÍNEZ Una vez
- Page 33 and 34: MIGUEL Á. TOLEDO MARTÍNEZ Ejemplo
- Page 35 and 36: MIGUEL Á. TOLEDO MARTÍNEZ // Copi
- Page 37 and 38: MIGUEL Á. TOLEDO MARTÍNEZ ofstrea
- Page 39 and 40: MIGUEL Á. TOLEDO MARTÍNEZ LECTURA
- Page 41 and 42: MIGUEL Á. TOLEDO MARTÍNEZ como de
- Page 43 and 44: MIGUEL Á. TOLEDO MARTÍNEZ { int r
- Page 45 and 46: MIGUEL Á. TOLEDO MARTÍNEZ Desplaz
- Page 47 and 48: MIGUEL Á. TOLEDO MARTÍNEZ El prog
- Page 49 and 50: MIGUEL Á. TOLEDO MARTÍNEZ /* El s
- Page 51 and 52: MIGUEL Á. TOLEDO MARTÍNEZ El prog
- Page 53 and 54: MIGUEL Á. TOLEDO MARTÍNEZ int sel
- Page 55 and 56: MIGUEL Á. TOLEDO MARTÍNEZ //Enví
- Page 57 and 58: MIGUEL Á. TOLEDO MARTÍNEZ PRIMER
- Page 59 and 60: MIGUEL Á. TOLEDO MARTÍNEZ LO QUE
- Page 61 and 62: MIGUEL Á. TOLEDO MARTÍNEZ apertur
- Page 63 and 64: MIGUEL Á. TOLEDO MARTÍNEZ b. Asig
- Page 65 and 66: MIGUEL Á. TOLEDO MARTÍNEZ 30. Ind
- Page 67 and 68: MIGUEL Á. TOLEDO MARTÍNEZ Utilice
- Page 69 and 70: MIGUEL Á. TOLEDO MARTÍNEZ double
MIGUEL Á. TOLEDO MARTÍNEZ<br />
Primero observe que cada una de las cadenas se han definido como un arreglo de caracteres. Se ha<br />
definido cada longitud de los arreglos para que sea un carácter más grande que lo necesario. Esto<br />
es para dejar espacio para el carácter del terminador nulo ‘\0’.<br />
UN POSIBLE PROBLEMA CUANDO SE USA getline()<br />
Aunque getline() trabaja cuando se leen cadenas de caracteres en forma consecutiva,<br />
tendrá problemas al tratar de usarla para leer una cadena de caracteres después de haber usado<br />
cin para leer una variable de tipo carácter o una variable numérica.<br />
Ejemplo 7.15<br />
cout