Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
A LGORITMOS Y P ROGRAMACIN
CADENAS
Expositor : Ing Ezzard Omar Alvarez Daz
4. Inicializacin de cadenas
5. Escritura y Lectura de datos tipo cadena 6. Funciones de manipulacin de cadenas 7. Arrays de cadenas
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 <<. int main( ) { cout << Esto es una cadena de texto; }
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.
C ADENAS
DE
T EXTO : D EFINICIN
A p o l o
1 3 \0
D IFERENCIA
ENTRE
C ADENAS
DE
T EXTO
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,
A p o l o
1 3 \0
A p o l o
1 3
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
C ADENAS
DE
T EXTO : D ECLARACIN
Para declarar una cadena capaz de almacenar el texto Apolo 13 haremos lo siguiente: Es vlido cualquiera de las 3
char titulo_pelicula[9];
char titulo_pelicula[10];
char titulo_pelicula[20];
C ADENAS
DE
T EXTO : I NICIALIZACIN
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 ; ...
El compilador reserva espacio para la cadena saludo. Dado que el tamao de hola es 4 caracteres, el compilador reserva 5
Cadena_texto = Saludo =
H o o l
l a
a \0
M u n d o \0
C ADENAS
DE
T EXTO : I NICIALIZACIN
Qu ocurra cuando inicializbamos solo algunas componentes de un array de caracteres como cadena de texto? 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
Si se trata de inicializar la cadena en el cuerpo del programa de la siguiente manera, nos dar un error de compilacin.
cadena_texto = Hola Mundo; ...
Ms adelante veremos que para realizar sta accin necesitamos recurrir a funciones de cadena (string.h).
10
C ADENAS
char cad_uno*20+ = Hola Mundo;
DE
H o H
a o l
M u n d o \0 a \0
11
C ADENAS
DE
T EXTO : E SCRITURA
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 <<.
char cad_uno*20+ = Hola Mundo; char nombre*4+ = Luis; cout << cad_uno;
cout escribe todos los caracteres desde la posicin 0 en adelante, hasta que se encuentre el carcter nulo \0
H o
a
i
M u n d o \0
s 6 9 g r \0
L u
12
C ADENAS
DE
T EXTO : L ECTURA
DE
CADENAS
La sentencia de lectura cin con el operador de extraccin >> produce anomalas si se aplica a una variable de tipo cadena.
Esto es porque cin termina la operacin de lectura cuando se encuentra un espacio en blanco.
...
Si el usuario introduce la entrada Jose Perez, la variable nombre contiene la siguiente informacin:
J o s e \0
13
C ADENAS
DE
T EXTO : L ECTURA
DE
CADENAS
C++ dispone de funciones especficas que en unin con cin, permite la lectura correcta de cadenas. cin.getline(cadena , tamao , carcter) iostream
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 debe ser 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] ; Si se introduce el texto casa cin.getline( nombre, 4 ); c a s a \0 cin.getline( nombre, 4, a);
c \0
F UNCIONES
14
Manipular datos en cadena Comparar cadenas Buscar caracteres y cadenas dentro de cadenas
15
En la librera <cstring> existen un conjunto de funciones predefinidas listas para ser usadas por el programador en el manejo de arrays de caracteres o cadenas de caracteres. En tanto que las funciones para la gestin de caracteres se encuentran definidas en la librera <ctype.h>.
16 UNCIONES
MS COMUNES EXISTENTES
Accin o Resultado
Cada una de estas funciones requiere de argumentos que en general denotados como cad1 y cad2 para significar cadena1 y cadena2 respectivamente.
Concatena o aade una copia de cad2 a cad1 y aade al final de cad1 el terminador nulo. Copia cad2 en cad1, es importante que cad2 tenga un terminador nulo. Devuelva la longitud de cad1. El carcter nulo de terminacin no se contabiliza. Compara alfabticamente cad1 con cad2. Devuelve 0 si cad1 y cad2 son iguales; menor que 0 si cad1<cad2; mayor que 0 si cad1>cad2. Concatena un mximo de n caracteres de cad2 en la cadena cad1 coloca el terminador nulo al final de cad1. Copia hasta n caracteres de cad2 en la cadena cad1. Recuerde que cad2 debe tener un terminador nulo. Devuelve un puntero a la primera ocurrencia del carcter c en la cadena cad1. Si no lo encuentra, devuelve un puntero nulo. Devuelve un puntero a la primera ocurrencia de la cadena cad2 en la cadena cad1. Si no lo encuentra, devuelve un puntero nulo. Devuelve un puntero a la ltima ocurrencia del carcter c en la cadena cad1. Devuelve un puntero nulo, si no lo encuentra. Devuelve un puntero a la siguiente palabra de la cadena apuntada por cad1. Los caracteres que constituyen la cadena apuntada por cad2 son los delimitadores que identifican la palabra. Devuelve un puntero nulo, cuando no hay ninguna cadena que devolver.
Nombre
strcat(cad1,cad2) strcpy(cad1,cad2) strlen(cad1) strcmp(cad1,cad2) strncat(cad1,cad2) strncpy(cad1,cad2) strchr(cad1,c) strstr(cad1,cad2) strrchr(cad1,c) strtok(cad1,cad2)
F UNCIONES
17
Nombre
islum(c)
isalpha(c)
MS COMUNES EXISTENTES
Accin o Resultado
isblank(c)
isspace(c)
isxdigit(c)
Devuelve un valor distinto de cero si c es una letra o un digito. Si el carcter c no es alfanumrico, devuelve cero. Devuelve un valor distinto de cero si c es una letra del alfabeto; en caso contrario devuelve cero. En el idioma ingls el alfabeto son letras maysculas y minsculas entre la A y la Z. Devuelve un valor distinto de cero si c es un carcter para el que isspace(c), devuelve verdad y adems se utiliza como separador de palabras. En ingles los separadores son el espacio y el tabulador horizontal. Devuelve un valor distinto de cero si c es un digito, es decir, de 0 a 9, en caso contrario devuelve cero. Devuelve un valor distinto de cero si c es una letra minscula, en caso contrario devuelve cero. Devuelve un valor distinto de cero si c es una letra mayscula, en caso contrario devuelve cero. Devuelve un valor distinto de cero si c es un carcter de puntuacin; en caso contrario devuelve cero. Un carcter de puntuacin, es aquel que es imprimible y que no es ni alfanumrico ni el espacio. Devuelve un valor distinto de cero si c es un espacio, un tabulador horizontal, un salto de pgina, un retorno de carro o un salto de lnea; en caso contrario devuelve cero. Devuelve un valor distinto de cero si c es un digito hexadecimal es cualquiera que est entre A F, a-f, 0-9.
CADENAS
F UNCIONES
19
Compara hasta n caracteres de la cadena s1 con la cadena s2. La funcin devuelve cero, menor de cero o mayor que cero si s1 es igual, menor o mayor a s2, respectivamente Compara la cadena s1 con la cadena s2. La funcion devuelve el valor 0, > 0 o < 0l de si s1 es igual. Menor o mayor que s2, respectivamente.
size_t strlen( const char *s ); Determina la longitud de la cadena s. Devuelve la cantidad de caracteres anteriores al carcter nulo.
F UNCIONES
20
Copiando cadenas
El primer argumento debe ser grande para almacenar la cadena y el caracter nulo
Especifica el numero de caracteres que seran copiados de la cadena al arreglo No necesita copiar el caracter nulo
21
C ADENAS
DE
T EXTO : M ANIPULACIN
DE
CADENAS
C++ dispone de la biblioteca de cadena string.h. Dicha biblioteca contiene funciones de manipulacin de cadenas. Veamos algunas de ellas:
string.h
Devuelve la longitud de la cadena dada como argumento. char nombre[30], dato[30] ; int tamao; gets(nombre); ... Si se introduce el texto Hola Mundo, tamao = strlen(nombre); la variable tamao toma el valor 10. strcpy(dato, nombre); ... Strcpy( cadena_destino , cadena_origen ) Copia la cadena_origen en la cadena_destino. string.h
22
C ADENAS
DE
T EXTO : M ANIPULACIN
string.h
DE
CADENAS
Strcmp ( cadena1 , cadena2 )
Esta funcin compara sus dos argumentos que son de tipo cadena y devuelve un entero. strcmp(c1, c2) strcmp(c1, c2) strcmp(c1, c2) devuelve 0 si c1 = c2 si c1 > c2 string.h devuelve un nmero negativo si c1 < c2 devuelve un nmero positivo
23
// // Usando strcpy y strncpy. 3 #include <iostream> 4 <cstring> contiene 5 using std::cout; prototipo de strcpy y 6 using std::endl; strncpy. 7 8 #include <cstring> // prototipo para strcpy y strncpy 9 10 int main() 11 { 12 char x[] = "Happy Birthday to You"; Copia la cadena completa 13 char y[ 25 ]; de un arreglo x dentro de 14 char z[ 15 ]; un arreglo y. 15 16 strcpy( y, x ); // copia el contenido de x dentro de y Copia los primeros 14 17 18 cout << "The string in array x is: " << x caracteres de un arreglo x 19 << "\nThe string in array y is: " << y << '\n'; dentro de un arreglo y. 20 Aade el caracter null observe que no se incluye 21 // copy first 14 characters of x into z 22 strncpy( z, x, 14 ); // does not copy null character caracter nulo . 23 z[ 14 ] = '\0'; // append '\0' to z's contents 24 25 cout << "The string in array z is: " << z << endl;
26 27 28 29
The string in array x is: Happy Birthday to You The string in array y is: Happy Birthday to You The string in array z is: Happy Birthday
F UNCIONES
25
Concatenar cadenas
Aade primer argumento al segundo argumento El primer caracter del segundo argumento remplaza el caracter nulo del primer argumento
Asegurarse que el primer argumento sea lo suficientemente largo para almacenar el resultado y el caracter nulo
2 26// Using strcat and strncat. 3 #include <iostream> 4 <cstring> contiene el 5 using std::cout; prototipo para strcat y 6 using std::endl; strncat. 7 8 #include <cstring> // prototypes for strcat and strncat 9 10 int main() 11 { 12 char s1[ 20 ] = "Happy "; 13 char s2[] = "New Year "; 14 char s3[ 40 ] = ""; Aade s2 a s1. 15 16 cout << "s1 = " << s1 << "\ns2 = " << s2; 17 18 strcat( s1, s2 ); // concatenate s2 to s1 19 20 cout << "\n\nAfter strcat(s1, s2):\ns1 = " << s1 Aade los primeros 6 21 << "\ns2 = " << s2; caracteres de s1a s3. 22 23 // concatenate first 6 characters of s1 to s3 24 strncat( s3, s1, 6 ); // places '\0' after last character 25
27
Aade s1 a s3.
26 27 28 29 30 31 32 33 34 35 cout << "\n\nAfter strncat(s3, s1, 6):\ns1 = " << s1 << "\ns3 = " << s3; strcat( s3, s1 ); // concatenate s1 to s3 cout << "\n\nAfter strcat(s3, s1):\ns1 = " << s1 << "\ns3 = " << s3 << endl; return 0; // indicates successful termination } // end main
F UNCIONES
28
Comparacin de cadenas
Codigos de caracter
ASCII
EBCDIC
F UNCIONES
29
Cero si la cadena es igual Negativo si la primera cadena es menor que la segunda cadena Positivo si primera cadena es mayor que la segunda cadena
Compara hasta determinado nmero de caracteres Detiene la comparacin si llega a un caracter nulo, en uno de los argumentos
30
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
// Usindo strcmp and strncmp. #include <iostream> using std::cout; using std::endl; #include <iomanip> using std::setw;
#include <cstring> // prototypes for strcmp and strncmp int main() { char *s1 = Feliz anio Nuevo"; char *s2 = Feliz anio Nuevo"; char *s3 = Feliz Navidad"; cout << "s1 = " << s1 << "\ns2 = " << s2 Compara << "\ns3 = " << s3 << "\n\nstrcmp(s1, s2) = " << setw( 2 ) << strcmp( s1, s2 ) << "\nstrcmp(s1, s3) = " << setw( 2 ) << strcmp( s1, s3 ) << "\nstrcmp(s3, s1) = " << setw( 2 ) << strcmp( s3, s1 );
Compara s1 y s2.
s1 y s3. Compara s3 y s1.
26 27 28 29 30 31 32 33 34 35
cout << "\n\nstrncmp(s1, s3, 6) = " << setw( ) .caracteres de Compara 7 de s1 y 2 s3 << strncmp( s1, s3, 6 ) << "\nstrncmp(s1, s3, s1 y s3 . 7) = " << setw( 2 ) << strncmp( s1, s3, 7 ) Compara 7 caracteres de << "\nstrncmp(s3, s1, 7) = " s3 y s1. << setw( 2 ) << strncmp( s3, s1, 7 ) << endl; return 0; // indicates successful termination
} // end main
s1 = Happy New Year s2 = Happy New Year s3 = Happy Holidays strcmp(s1, s2) = 0 strcmp(s1, s3) = 1 strcmp(s3, s1) = -1 strncmp(s1, s3, 6) = 0 strncmp(s1, s3, 7) = 1 strncmp(s3, s1, 7) = -1
F UNCIONES
32
33
// Using strlen. 3 #include <iostream> 4 <cstring> contiene 5 using std::cout; prototipo para strlen. 6 using std::endl; 7 8 #include <cstring> // prototype for strlen 9 10 int main() 11 { 12 char *string1 = "abcdefghijklmnopqrstuvwxyz"; 13 char *string2 = "four"; 14 char *string3 = "Boston"; 15 16 cout << "The length of \"" << string1 17 << "\" is " << strlen( string1 ) 18 << "\nThe length of \"" << string2 Usa strlen para 19 << "\" is " << strlen( string2 ) determinar la longitud 20 << "\nThe length of \"" << string3 la cadena. 21 << "\" is " << strlen( string3 ) << endl; 22 23 return 0; // indicates successful termination 24 25 } // end main
de