CONTENIDOS 1. Introduccin a las cadenas 2. Definicin 3. Declaracin de cadenas 4. Inicializacin de cadenas 5. Escritura y Lectura de datos tipo cadena 6. Funciones de manipulacin de cadenas 7. Arrays de cadenas 2 INTRODUCCIN AL TIPO COMPUESTO CADENA Introduccin: Vamos a ver por fin cmo manejar TEXTO en C++, ya que hasta el momento solo lo hemos mostrado por pantalla mediante la sentencia cout y el operador de insercin <<. C++ no tiene como otros lenguajes de programacin, un tipo de datos bsico para almacenar texto, como puede ser el tipo string. C++ utilizar ARRAYS DE CARACTERES para almacenar texto. void main() {
cout << Esto es una cadena de texto; } 3 INTRODUCCIN AL TIPO COMPUESTO CADENA Cadenas de Texto: Definicin Una cadena de texto es una secuencia de caracteres. Ejemplos de cadenas son: Don Quijote de la Mancha Hola Mundo Apolo 13 En C++ una cadena se considera como un array de caracteres terminado con el carcter nulo \0. A p o l o 1 3 \0 La cadena de texto Apolo 13 se almacena as 4 INTRODUCCIN AL TIPO COMPUESTO CADENA Diferencia entre Cadenas de Texto y arrays de caracteres La principal diferencia entre una cadena y un array de caracteres, es que una cadena siempre termina con el carcter nulo \0 y los arrays de caracteres no. Como conclusin, podemos decir que - Todas las cadenas de texto son arrays de caracteres, - pero, no todos los arrays de caracteres almacenan cadenas. A p o l o 1 3 \0 A p o l o 1 3 Array de caracteres de tamao 8. Cadena de de longitud 8. 5 INTRODUCCIN AL TIPO COMPUESTO CADENA Cadenas de Texto: Declaracin Las cadenas de texto se declaran como se declaraban los arrays de caracteres, indicando el tamao mximo de la cadena + 1. char <nombre_de_cadena> [ tamao_mximo +1 ]; Sintaxis char cabecera[10]; char nombre[8]; Ejemplos: La variable cabecera puede contener una cadena de texto de tamao mximo 9 o un array de 10 posiciones. Se declaran de la misma manera, por tanto la diferencia radica en el uso que se le de a la variable 6 INTRODUCCIN AL TIPO COMPUESTO CADENA Cadenas de Texto: Declaracin Para declarar una cadena capaz de almacenar el texto Apolo 13 haremos lo siguiente: char titulo_pelicula[9]; char titulo_pelicula[10]; char titulo_pelicula[20]; char titulo_pelicula[8]; Es vlido cualquiera de las 3 7 INTRODUCCIN AL TIPO COMPUESTO CADENA Cadenas de Texto: Inicializacin Las cadenas de caracteres no se pueden inicializar fuera de la declaracin. Inicializacin de cadenas en la declaracin:
char cadena_texto[20] = Hola Mundo; char saludo[] = Hola ; ... La cadena cadena_texto puede contener un mximo de 19 caracteres ms el carcter nulo \0 El compilador reserva espacio para la cadena saludo. Dado que el tamao de hola es 4 caracteres, el compilador reserva 5 H o l a M u n d o \0 Cadena_texto = H o l a \0 Saludo = 8 INTRODUCCIN AL TIPO COMPUESTO CADENA Cadenas de Texto: Inicializacin Qu ocurra cuando inicializbamos solo algunas componentes de un array de caracteres como cadena de texto? Si se trata de inicializar la cadena en el cuerpo del programa de la siguiente manera, nos dar un error de compilacin. Ms adelante veremos que para realizar sta accin necesitamos recurrir a funciones de cadena (string.h).
cadena_texto = Hola Mundo; ... E r r o r
!! El compilador no inicializa el resto de elementos con el carcter nulo \0 Cadena_texto = H o l a M u n d o \0 9 INTRODUCCIN AL TIPO COMPUESTO CADENA Cadenas de Texto: Ejemplos de Inicializacin
char cad_uno[20] = Hola Mundo; char cad_dos[20] = {H,o,l,a, ,M,u,n,d,o }; char cad_tres[20] = { Hola Mundo}; ... char saludo_uno[] = Hola ; char saludo_dos[] = { Hola} ; ... char saludo_tres[] = {H, o, l, a}; ... H o l a \0 saludo_uno = saludo_dos = H o l a saludo_tres = cad_uno = cad_tres = H o l a M u n d o \0
char nombre[4] = Luis; ... L u i s No podemos tratarlo como una cadena. S como un array de caracteres. 10 INTRODUCCIN AL TIPO COMPUESTO CADENA Cadenas de Texto: Escritura de cadenas Para escribir el contenido de una variable de tipo cadena en consola, utilizamos la sentencia de escritura cout con el operador de insercin <<. cout escribe todos los caracteres desde la posicin 0 en adelante, hasta que se encuentre el carcter nulo \0 char cad_uno[20] = Hola Mundo; char nombre[4] = Luis;
cout << cad_uno; cout << nombre; H o l a M u n d o \0 cad_uno = L u i s 6 9 g r t \0 v nombre = En consola aparece: Hola Mundo En consola aparece: Luis69grt 11 INTRODUCCIN AL TIPO COMPUESTO CADENA Cadenas de Texto: Lectura de cadenas La sentencia de lectura cin con el operador de extraccin >> produce anomalas si se aplica a una variable de tipo cadena.
char nombre[20] ;
cin >> nombre; ... Esto es porque cin termina la operacin de lectura cuando se encuentra un espacio en blanco. Si el usuario introduce la entrada Antonio de Nebrija, la variable nombre contiene la siguiente informacin: A n t o n i o \0 Qu guarda aqu el compilador ? 12 INTRODUCCIN AL TIPO COMPUESTO CADENA Cadenas de Texto: Lectura de cadenas Sirve para leer una lnea completa incluyendo espacios en blanco. - cadena: nombre de la variable donde queremos guardar la cadena. - tamao: n mximo de caracteres que se leern. El tamao deber como mucho la longitud que aparece en la declaracin de la cadena. - carcter: se leern caracteres hasta que se encuentre el carcter aqu especificado. Si no se pone, el compilador supone que es \n. char nombre[4] ;
cin.getline( nombre, 4 ); cin.getline( nombre, 4, a); c c a s \0 Si se introduce el texto casa cin.getline: cadena tamao carcter void iostream.h C++ dispone de funciones especficas que en unin con cin, permite la lectura correcta de cadenas. \0 13 INTRODUCCIN AL TIPO COMPUESTO CADENA Cadenas de Texto: Lectura de cadenas Sirve para leer carcter a carcter el flujo de entrada. La funcin cin.get(letra) lee un carcter y lo guarda en letra. Devuelve 0 si el carcter ledo es final de archivo. En otro caso devuelve 1. char letra ; bool fin;
fin = cin.get( letra ); if (fin == 0) cout << "fin de archivo"; ... cin.get : char bool iostream.h cin.ignore() iostream.h Sirve para leer uno o ms caracteres sin procesar del flujo de entrada. El carcter fin de archivo es: Control+Z (Windows/Dos) Control+D (Unix) 14 INTRODUCCIN AL TIPO COMPUESTO CADENA Cadenas de Texto: Lectura de cadenas Otras funciones para la lectura de cadenas. Sirve para leer una lnea desde el archivo de entrada. Lee hasta que encuentra un salto de lnea. Se llama a sta funcin con el nombre de la variable donde queremos guardar la cadena leda. char nombre[20] ;
gets( nombre ); ... H o l a M u n d o \0 Si se introduce el texto Hola Mundo gets : cadena void stdio.h nombre = Console I/O 15 INTRODUCCIN AL TIPO COMPUESTO CADENA Cadenas de Texto: Lectura de cadenas Sirve para leer un carcter del flujo de entrada sin que aparezca en pantalla. Se la llama sin argumentos y devuelve un entero. char letra ;
letra = getch(); if (letra == S) cout << Ha elegido seguir"; ... getch : void int conio.h getchar : void int stdio.h Sirve para leer el siguiente carcter del flujo de entrada. Se la llama sin argumentos y devuelve un entero. Ejemplo Console I/O 16 INTRODUCCIN AL TIPO COMPUESTO CADENA Cadenas de Texto: Lectura de cadenas void main() { char letra ; bool seguir = true; while (seguir) { letra = getchar(); if (letra == '\n') { cout << "fin de lnea"; seguir = false; } else cout << letra; } getch(); } Ejemplo: Las funciones getch y getchar estn especializadas en la captura de un solo carcter. La diferencia es que getchar lee un carcter y lo imprime en pantalla. Sin embargo getch, lo lee pero no lo imprime en pantalla. Se utilizan para: - lectura de un solo carcter - retener pantallas. 17 INTRODUCCIN AL TIPO COMPUESTO CADENA Cadenas de Texto: Manipulacin de cadenas C++ dispone de la biblioteca de cadena string.h. Dicha biblioteca contiene funciones de manipulacin de cadenas. Veamos algunas de ellas: Devuelve la longitud de la cadena dada como argumento. char nombre[30], dato[30] ; int tamao;
gets(nombre); ... tamao = strlen(nombre); strcpy(dato, nombre); ... strlen: cadena int string.h Si se introduce el texto Hola Mundo, la variable tamao toma el valor 10. Copia la cadena_origen en la cadena_destino. strcpy: cadena_destino cadena_origen void string.h 18 INTRODUCCIN AL TIPO COMPUESTO CADENA Cadenas de Texto: Manipulacin de cadenas Esta funcin compara sus dos argumentos que son de tipo cadena y devuelve un entero. char nombre[30] = Antonio, apellido[30]=Nebrija ; int b; . b = strcmp(nombre,apellido); // devuelve un nmero negativo strcat(nombre, apellido); ... strcmp: cadena1 cadena2 int string.h strcat: cadena_destino cadena_origen void string.h strcmp(c1, c2) devuelve 0 si c1 = c2 strcmp(c1, c2) devuelve un nmero negativo si c1 < c2 strcmp(c1, c2) devuelve un nmero positivo si c1 > c2 Esta funcin concatena la cadena fuente a continuacin de la cadena destino. 19 INTRODUCCIN AL TIPO COMPUESTO CADENA Cadenas de Texto: Arrays de cadenas typedef char nombre[30]; . nombre lista [20] ; ... Para almacenar varios datos de tipo cadena en un array, podemos hacerlo de varias formas: 1. Usando la instruccin typedef . char lista [20][30] ; ... 2. Usando un array de 2 dimensiones ... ... A n a \0 .. P e p e \0 0 1 2 29 0 1 19 lista = vector = "Ana" "Pepe" "Juan" 0 1 19 lista = Permite al programador definir un nuevo tipo de datos en funcin de tipos ya conocidos Tipo de datos nombre