You are on page 1of 59

Cadenas y funciones de

cadena
Parte 1
Clase 10
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.
Cadenas y funciones de cadena

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

a) Array de caracteres

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

b) Cadena caracteres
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’.
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:
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’
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’
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.
Declaración de variables 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.
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:
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.
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
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 ( ).
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:
Inicialización de variables 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.
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)?
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.
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.
Inicialización de variables de cadena

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


Inicialización de variables de cadena

• La lectura de cadenas con cin se realiza con el siguiente


formato:
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’.
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.
Inicialización de variables de cadena

• El ejemplo anterior para leer la cadena Nombre se


convierte en:
Inicialización de variables de cadena
Inicialización de variables de cadena

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


caracteres siguientes:
• Nombre

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


aleatorio
s

• [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12]
Ejemplo
Ejemplo
Cadenas y funciones de cadena

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


de un usuario
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).
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.
La Biblioteca String.h

• El uso de las funciones de cadena tienen una variable parámetros


a declarada similar a:
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.
Función Cabecera de la función y prototipo
strlen size_t strlen(const char *s);
Devuelve la longitud de la cadena s.
La Biblioteca String.h
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.
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.
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.
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.
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.
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.
Arrays y Cadenas como parámetros de
funciones
Arrays y Cadenas como parámetros de
funciones
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.
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.
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];


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];
Uso del operador de referencia para tipos
array
Uso del operador de referencia para tipos
array
Uso de punteros para pasar una cadena

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


Uso de punteros para pasar una 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.
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
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
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:
Ejemplo
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 ( ).
Ejemplo
Ejemplo

You might also like