cadenas y funciones de cadena
TRANSCRIPT
![Page 1: Cadenas y funciones de cadena](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/1.jpg)
Cadenas y funciones de cadena
Parte 1Clase 10
![Page 2: Cadenas y funciones de cadena](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/2.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/3.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/4.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/5.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/6.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/7.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/8.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/9.jpg)
Declaración de variables de cadena
![Page 10: Cadenas y funciones de cadena](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/10.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/11.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/12.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/13.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/14.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/15.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/16.jpg)
Inicialización de variables de cadena
![Page 17: Cadenas y funciones de cadena](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/17.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/18.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/19.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/20.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/21.jpg)
Inicialización de variables de cadena
• La sintaxis de la función getline ( ) es:
![Page 22: Cadenas y funciones de cadena](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/22.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/23.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/24.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/25.jpg)
Inicialización de variables de cadena
• El ejemplo anterior para leer la cadena Nombre se convierte en:
![Page 26: Cadenas y funciones de cadena](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/26.jpg)
Inicialización de variables de cadena
![Page 27: Cadenas y funciones de cadena](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/27.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/28.jpg)
Ejemplo
![Page 29: Cadenas y funciones de cadena](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/29.jpg)
Ejemplo
![Page 30: Cadenas y funciones de cadena](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/30.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/31.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/32.jpg)
Cadenas y funciones de cadena
![Page 33: Cadenas y funciones de cadena](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/33.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/34.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/35.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/36.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/37.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/38.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/39.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/40.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/41.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/42.jpg)
Arrays y Cadenas como parámetros de funciones
![Page 43: Cadenas y funciones de cadena](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/43.jpg)
Arrays y Cadenas como parámetros de funciones
![Page 44: Cadenas y funciones de cadena](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/44.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/45.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/46.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/47.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/48.jpg)
Uso del operador de referencia para tipos array
![Page 49: Cadenas y funciones de cadena](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/49.jpg)
Uso del operador de referencia para tipos array
![Page 50: Cadenas y funciones de cadena](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/50.jpg)
Uso de punteros para pasar una cadena
• Los punteros se pueden utilizar para pasar arrays a funciones:
![Page 51: Cadenas y funciones de cadena](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/51.jpg)
Uso de punteros para pasar una cadena
![Page 52: Cadenas y funciones de cadena](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/52.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/53.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/54.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/55.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/56.jpg)
Ejemplo
![Page 57: Cadenas y funciones de cadena](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/57.jpg)
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](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/58.jpg)
Ejemplo
![Page 59: Cadenas y funciones de cadena](https://reader036.vdocuments.site/reader036/viewer/2022062400/5871251b1a28abe4448b5edd/html5/thumbnails/59.jpg)
Ejemplo