cadenas y funciones de cadena

59
Cadenas y funciones de cadena Parte 1 Clase 11

Upload: tensor

Post on 12-Apr-2017

208 views

Category:

Education


0 download

TRANSCRIPT

Page 1: Cadenas y funciones de cadena

Cadenas y funciones de cadena

Parte 1Clase 11

Page 2: Cadenas y funciones de cadena

Cadenas y funciones de cadena

• C++ ( y su lenguaje padre, C) no tiene datos predefinidos tipo cadena (string). En su lugar, C++, como C, manipula cadenas mediante arrays de caracteres que terminan con el carácter nulo ASCII (‘ \0’).

• Una cadena se considera como un array unidimensional de tipo char o unsigned char.

Page 3: Cadenas y funciones de cadena

Cadenas y funciones de cadena

L a c a d e n a d e t e s t

L a c a d e n a d e t e s t \0

a)

b)

b) Cadena caracteres

a) Array de caracteres

Page 4: Cadenas y funciones de cadena

Concepto de Cadena

• Una cadena es un tipo dato compuesto, un array de caracteres (char), terminado por un carácter nulo (‘ /0’).

• Una cadena (también llamada constante de cadena o literal de cadena) es “ABC”. Cuando la cadena aparece dentro de un programa se verá como si se almacenaran cuatro elementos: ‘A’, ‘B’, ‘C’ y ‘\0’.

Page 5: Cadenas y funciones de cadena

Concepto de Cadena

• En consecuencia, se considera que la cadena “ABC” es un array de cuatro elementos de tipo char.

• El valor real de esta cadena es la dirección de su primer carácter y su tipo es un puntero char. Aplicando el operador * a un objeto de tipo se obtiene el carácter que forma su contenido; es posible también utilizar aritmética de direcciones con cadenas:

Page 6: Cadenas y funciones de cadena

Concepto de Cadena

*”ABC” Es igual a ‘A’*(“ABC” +1) Es igual a ‘B’*(“ABC” +2) Es igual a ‘C’*(“ABC” +3) Es igual a ‘\0’

Page 7: Cadenas y funciones de cadena

Concepto de Cadena

• De igual forma, utilizando el subíndice del array se puede escribir:“ABC” [0] Es igual a ‘A’

“ABC” [1] Es igual a ‘B’“ABC” [2] Es igual a ‘C’“ABC” [3] Es igual a ‘\0’

Page 8: Cadenas y funciones de cadena

Declaración de variables de cadena

• Las cadenas se declaran como los restantes tipos de

arrays. El operador postfijo [ ] contiene el tamaño máximo del objeto. El tipo base, naturalmente, es char, o bien unsigned char.

Page 9: Cadenas y funciones de cadena

Declaración de variables de cadena

Page 10: Cadenas y funciones de cadena

Declaración de variables de cadena

• El tipo unsigned char puede ser de interés en aquellos

casos en que los caracteres especiales presentes

puedan tener el bit de orden alto activado. Si el carácter

se considera con signo, el bit de mayor peso (orden alto)

se interpreta como bit de signo y se puede propagar a la

posición de mayor orden (peso) de nuevo tipo.

Page 11: Cadenas y funciones de cadena

Declaración de variables de cadena

• Observe que el tamaño de la cadena ha de incluir el carácter ‘\0’. En consecuencia, para definir un array de caracteres que contenga la cadena “ABC-DEF”, escriba:

Page 12: Cadenas y funciones de cadena

Inicialización de variables de cadena

• Todos los tipos de arrays requieren una inicialización que consiste en una lista de valores separados por comas y encerrados entre llaves.

Page 13: Cadenas y funciones de cadena

Inicialización de variables de cadena

• Dado que en el literal hay 36 caracteres y el compilador añade el carácter ‘\0’, un total de 37 caracteres se asignarán a cadenatest.

• Ahora bien, una dena no se puede inicializar fuera de la declaración. Por ejemplo, si se trata de hacer

Page 14: Cadenas y funciones de cadena

Inicialización de variables de cadena

• C++ le dará un error al compilar. La razón es que un

identificador de cadena, como cualquier identificador de Array,

se trata como un valor de dirección.• ¿Cómo se puede inicializar una cadena fuera de la declaración?

Más adelante se verá, pero podemos indicar que será necesario utilizar una función de cadena denominada strcpy ( ).

Page 15: Cadenas y funciones de cadena

Inicialización de variables de cadena

• La lectura usual de datos con el objeto cin y el operador >>, cuando se aplica a datos de cadena, producirá normalmente anomalías. Así, por ejemplo, trate de ejecutar el siguiente programa:

Page 16: Cadenas y funciones de cadena

Inicialización de variables de cadena

Page 17: Cadenas y funciones de cadena

Inicialización de variables de cadena

• El programa define Nombre como un array de caracteres de 30 elementos. Suponga que introduce la entrada Pepe Mackoy, cuando ejecuta el programa se visualizara en pantalla Pepe. Es decir la palabra Mackoy no se ha asignado a la variable cadena Nombre.

Page 18: Cadenas y funciones de cadena

Inicialización de variables de cadena

• La razón es que el objeto cin termina la operación de lectura siempre que se encuentra en un espacio en blanco.

• Así pues, ¿Cuál será el método correcto para lectura de cadenas, cuando estas cadenas, contienen mas de una palabra (caso muy usual)?

Page 19: Cadenas y funciones de cadena

Inicialización de variables de cadena

• El método recomendado será utilizar una función

denominada getline( ), en unión con cin, en lugar del operador >>. La función getline permitirá a cin leer la cadena completa, incluyendo cualquier espacio en blanco.

Page 20: Cadenas y funciones de cadena

Inicialización de variables de cadena

• cin es un objeto de la clase istream y getline ( ) es

una función miembro de la clase iostream; en

consecuencia, cin puede llamar a getline ( ) para

leer una línea completa incluyendo cualquier

espacio en blanco.

Page 21: Cadenas y funciones de cadena

Inicialización de variables de cadena

• La sintaxis de la función getline ( ) es:

Page 22: Cadenas y funciones de cadena

Inicialización de variables de cadena

• La lectura de cadenas con cin se realiza con el

siguiente formato:

Page 23: Cadenas y funciones de cadena

Inicialización de variables de cadena

• La función getline ( ) utiliza tres argumentos. El primer argumento es el identificador de la variable cadena (nombre de la cadena). El segundo argumento es la longitud máxima de la cadena (él numero máximo de caracteres que se leerán), que debe ser al menos dos caracteres mayor que la cadena real, para permitir el carácter nulo ‘\0’y el ‘\n’.

Page 24: Cadenas y funciones de cadena

Inicialización de variables de cadena

• Por ultimo, el carácter separador se lee y almacena como el siguiente al ultimo carácter de la cadena. La función getline ( ) inserta automáticamente el carácter núlo como le ultimo carácter de la cadena.

Page 25: Cadenas y funciones de cadena

Inicialización de variables de cadena

• El ejemplo anterior para leer la cadena Nombre se convierte en:

Page 26: Cadenas y funciones de cadena

Inicialización de variables de cadena

Page 27: Cadenas y funciones de cadena

Inicialización de variables de cadena

• Si se introduce la cadena Pepe Markov, el Array Nombre almacenará los caracteres siguientes:

• Nombre

• [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12]

P e P e M a r k o y ‘\n’ ‘\0’ … datos aleatorios

Page 28: Cadenas y funciones de cadena

Ejemplo

Page 29: Cadenas y funciones de cadena

Ejemplo

Page 30: Cadenas y funciones de cadena

Cadenas y funciones de cadena

• El siguiente programa lee y escribe el nombre, dirección y teléfono

de un usuario

Page 31: Cadenas y funciones de cadena

Cadenas y funciones de cadena

• Esto es muy sencillo si usamos la función cin.getline( ); Esta función necesita tres datos o parámetros:

• Nombre. El nombre de la variable que va a contener el string

• Longitud. La cantidad de caracteres que queremos que se puedan introducir (nunca mayor que la longitud del string).

• Carácter de fin. El carácter que el usuario va usar como final de la cadena. Por lo general es el ‘enter’ que se representa como ‘n’ (diagonal n).

Page 32: Cadenas y funciones de cadena

Cadenas y funciones de cadena

Page 33: Cadenas y funciones de cadena

La Biblioteca String.h

• La biblioteca estándar de C++ contiene la biblioteca de cadena STRING.H, que contiene las funciones de manipulación de cadenas utilizadas mas frecuentemente.

• Los archivos de cabecera STDIO.H e IOSTREAM.H también soportan E/S de cadenas. Algunos fabricantes de C++ también incorporan otras bibliotecas para manipular cadenas, pero como no son estándar no se consideraran en esta sesión.

Page 34: Cadenas y funciones de cadena

La Biblioteca String.h

• El uso de las funciones de cadena tienen una variable parámetros a declarada similar a:

Page 35: Cadenas y funciones de cadena

La Biblioteca String.h

• Esto significa que la función esperar un puntero a una cadena. Cuando se utiliza la función, se puede usar un puntero a una cadena o se puede especificar el nombre de una variable array char. La Tabla 1 resume algunas de las funciones cadena más usuales.

Page 36: Cadenas y funciones de cadena

La Biblioteca String.h

Función Cabecera de la función y prototipostrlen size_t strlen(const char *s);

Devuelve la longitud de la cadena s.strcpy char * strcpy(char *dest, const char *fuente);

Copia la cadena fuente a la cadena destinostrcmp in strcmp(const char *s1, const char *s2);

Compara la cadena s1 a s2 y devuelve: 0 si s1 = s2<0 si s1 < s2>0 si s1 > s2

strcmpi int strcmpi(const char *s1, const char *s2);Igual que strcmp( ), pero trata los caracteres como si fueran todos minusculas

strcat char *strcat(char *destino, const char *fuente);Añade la cadena fuente al final de destino

strnset char *strnset(char *s, int ch, size_t n);Utiliza strcmp( ) sobre una cadena existente par fijar n bytes de la cadena al carácter ch.

strstr char *strstr(const char *s1, const char *s2);Busca la cadena s2 en s1 y devuelve un puntero a los caracteres donde se encuentra s2.

Page 37: Cadenas y funciones de cadena

La palabra reservada const

• Las funciones de cadena declaradas en STRING.H, recogidas en la Tabla 1 y algunas otras, incluyen la palabra reservada const. La ventaja de esta palabra reservada es que se puede ver rápidamente la diferencia entre los parámetros de entrada y salida.

Page 38: Cadenas y funciones de cadena

La palabra reservada const

• Por ejemplo, el segundo parámetro fuente de strcpy representa el área fuente; se utiliza solo para copiar los caracteres de ella, de modo que esta área no se modificara. La palabra reservada const se utiliza para esta tarea.

• Se considera un parámetro de entrada, ya que la función recibe datos a través de ella.

Page 39: Cadenas y funciones de cadena

La palabra reservada const

• En contraste el primer parámetro dest de strcmpy es el área de destino, la cual se sobrescribirá y, por consiguiente, no se debe utilizar const para ello. En este caso, el parámetro correspondiente se denomina parámetro de salida, ya que los datos se escriben en el área destino.

Page 40: Cadenas y funciones de cadena

Arrays y Cadenas como parámetros de funciones

• Los arrays y cadenas se pueden pasar solo por referencia, no por valor. En la función, las referencias a los elementos individuales se hacen por indirección de la dirección objeto.

Page 41: Cadenas y funciones de cadena

Arrays y Cadenas como parámetros de funciones

• Considérese el programa C++ PASARRAY.CPP, que

implementa una función Longitud( ) que calcula la longitud

de una cadena terminada en nulo. El parámetro cad se

declara como un array de caracteres de tamaño desconocido.

• Este ejemplo es un caso que muestra el paso de un array por

valor, método no recomendado.

Page 42: Cadenas y funciones de cadena

Arrays y Cadenas como parámetros de funciones

Page 43: Cadenas y funciones de cadena

Arrays y Cadenas como parámetros de funciones

Page 44: Cadenas y funciones de cadena

Arrays y Cadenas como parámetros de funciones

• El programa principal contiene el código para la

dirección de la constante de cadena a la función

Longitud ( ). El cuerpo bucle while dentro de la función

cuenta con los caracteres no nulos y termina cuando

se encuentra el byte nulo al final de la cadena.

Page 45: Cadenas y funciones de cadena

Uso del operador de referencia para tipos array

• Otro método de escribir la función Longitud ( ) es utilizar el operador de referencia & C++. Cuando se utiliza este operador, se pasa por el parámetro por referencia.

Page 46: Cadenas y funciones de cadena

Uso del operador de referencia para tipos array

• Se puede dar un nombre nuevo a cualquier tipo de datos mediante typedef.

• La sintaxis es typedef declaración;

• donde declaración tiene la forma de una declaración de variable, sólo que se está definiendo un tipo de datos.

• typedef long pareja [2];

Page 47: Cadenas y funciones de cadena

Uso del operador de referencia para tipos array

• define un tipo pareja que se puede usar en declaraciones de variables:

• pareja p;

• es equivalente a

• long p [2];

Page 48: Cadenas y funciones de cadena

Uso del operador de referencia para tipos array

Page 49: Cadenas y funciones de cadena

Uso del operador de referencia para tipos array

Page 50: Cadenas y funciones de cadena

Uso de punteros para pasar una cadena

• Los punteros se pueden utilizar para pasar arrays a funciones:

Page 51: Cadenas y funciones de cadena

Uso de punteros para pasar una cadena

Page 52: Cadenas y funciones de cadena

Uso de punteros para pasar una cadena

• Observe que en las declaraciones de parámetros ningún array esta definido sino punteros tipo char. En la línea:

• *dest++ = *fuente++;

• Los punteros se utilizan para acceder a las cadenas fuente y destino, respectivamente. En la llamada a la función extraer se utiliza el operador & para obtener la dirección de las cadenas fuente y destino.

Page 53: Cadenas y funciones de cadena

Asignación de Cadenas

• C++ soporta dos métodos para asignar cadenas. Uno de ellos se ha visto cuando se inicializan las variables de cadena. La sintaxis utilizada era

Page 54: Cadenas y funciones de cadena

Ejemplo

• C++ soporta dos métodos para asignar cadenas. Uno de ellos se ha visto cuando se inicializan las variables de cadena. La sintaxis utilizada era

Page 55: Cadenas y funciones de cadena

Ejemplo

• El segundo método para asignación de una cadena a otra es utilizar la función strcpy. La función strcpy copia los caracteres de la cadena fuente a la carpeta destino. La funcione supone que la cadena destino tiene espacio suficiente para contener toda la cadena fuente. El prototipo de función es:

Page 56: Cadenas y funciones de cadena

Ejemplo

Page 57: Cadenas y funciones de cadena

Ejemplo

• La función strcpy( ) copia “Cadena a copiar” en la cadena nombre y añade un carácter nulo al final de la cadena resultante. El siguiente programa muestra una aplicación de strcpy ( ).

Page 58: Cadenas y funciones de cadena

Ejemplo

Page 59: Cadenas y funciones de cadena

Ejemplo