Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Cadenas y funciones de cadena

354 views

Published on

Cadenas y funciones de cadena

Published in: Education
  • Be the first to comment

  • Be the first to like this

Cadenas y funciones de cadena

  1. 1. Cadenas y funciones de cadena Parte 1 Clase 10
  2. 2. 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.
  3. 3. 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
  4. 4. 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’.
  5. 5. 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:
  6. 6. 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’
  7. 7. 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’
  8. 8. 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.
  9. 9. Declaración de variables de cadena
  10. 10. 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.
  11. 11. 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:
  12. 12. 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.
  13. 13. 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
  14. 14. 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 ( ).
  15. 15. 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:
  16. 16. Inicialización de variables de cadena
  17. 17. 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.
  18. 18. 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)?
  19. 19. 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.
  20. 20. 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.
  21. 21. Inicialización de variables de cadena • La sintaxis de la función getline ( ) es:
  22. 22. Inicialización de variables de cadena • La lectura de cadenas con cin se realiza con el siguiente formato:
  23. 23. 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’.
  24. 24. 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.
  25. 25. Inicialización de variables de cadena • El ejemplo anterior para leer la cadena Nombre se convierte en:
  26. 26. Inicialización de variables de cadena
  27. 27. 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 aleatorio s
  28. 28. Ejemplo
  29. 29. Ejemplo
  30. 30. Cadenas y funciones de cadena • El siguiente programa lee y escribe el nombre, dirección y teléfono de un usuario
  31. 31. 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).
  32. 32. Cadenas y funciones de cadena
  33. 33. 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.
  34. 34. La Biblioteca String.h • El uso de las funciones de cadena tienen una variable parámetros a declarada similar a:
  35. 35. 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.
  36. 36. La Biblioteca String.h Función Cabecera de la función y prototipo strlen 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 destino strcmp 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.
  37. 37. 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.
  38. 38. 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.
  39. 39. 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.
  40. 40. 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.
  41. 41. 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.
  42. 42. Arrays y Cadenas como parámetros de funciones
  43. 43. Arrays y Cadenas como parámetros de funciones
  44. 44. 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.
  45. 45. 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.
  46. 46. 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];
  47. 47. 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];
  48. 48. Uso del operador de referencia para tipos array
  49. 49. Uso del operador de referencia para tipos array
  50. 50. Uso de punteros para pasar una cadena • Los punteros se pueden utilizar para pasar arrays a funciones:
  51. 51. Uso de punteros para pasar una cadena
  52. 52. 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.
  53. 53. 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
  54. 54. 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
  55. 55. 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:
  56. 56. Ejemplo
  57. 57. 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 ( ).
  58. 58. Ejemplo
  59. 59. Ejemplo

×