Sei sulla pagina 1di 34

UNIVERSIDAD NACIONAL MAYOR DE SAN MARCOS

FACULTAD DE INGENIERIA INDUSTRIAL

A LGORITMOS Y P ROGRAMACIN

CADENAS
Expositor : Ing Ezzard Omar Alvarez Daz

INTRODUCCIN AL TIPO COMPUESTO CADENA


CONTENIDOS 1. Introduccin a las cadenas 2. Definicin 3. Declaracin de cadenas

4. Inicializacin de cadenas
5. Escritura y Lectura de datos tipo cadena 6. Funciones de manipulacin de cadenas 7. Arrays de cadenas

INTRODUCCIN AL TIPO COMPUESTO CADENA


Introduccin:

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

Una cadena de texto es una secuencia de caracteres. Ejemplos de cadenas son:

Don Quijote de la Mancha Hola Mundo Apolo 13


En C++ una cadena se considera como un array de caracteres terminado con el carcter nulo \0.
La cadena de texto Apolo 13 se almacena as

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,

- pero, no todos los arrays de caracteres almacenan cadenas.


Cadena de de longitud 8.

A p o l o

1 3 \0

A p o l o

1 3

Array de caracteres de tamao 8.

C ADENAS DE T EXTO : D ECLARACIN


Las cadenas de texto se declaran como se declaraban los arrays de caracteres, indicando el tamao mximo de la cadena + 1.

char <nombre_de_cadena> [ tamao_mximo +1 ];

Ejemplos: char cabecera[10]; char nombre[8];

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

La cadena cadena_texto puede contener un mximo de 19 caracteres ms el carcter nulo \0

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

T EXTO : E JEMPLOS DE I NICIALIZACIN


char nombre[4] = Luis; ...

char cad_dos*20+ = ,H,o,l,a, ,M,u,n,d,o -;


char cad_tres*20+ = , Hola Mundo-; ... char saludo_uno* + = Hola ; char saludo_dos* + = , Hola- ; ... char saludo_tres* + = ,H, o, l, a-; Cad_uno = cad_tres =

No podemos tratarlo como una cadena. S como un array de caracteres

H o H

a o l

M u n d o \0 a \0

Saludo_uno = saludo_dos = Saludo_tres =

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

En consola aparece: Hola Mundo cout << nombre; cad_uno = nombre =

H o

a
i

M u n d o \0
s 6 9 g r \0

L u

En consola aparece: Luis69gr

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.

char nombre[20] ; cin >> nombre;

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

PARA LA MANIPULACIN DE STRING

CADENAS DE LA LIBRERIA DE CABECERA

La libreria de cabecera de cadenas <cstring> proporciona funciones para:


Manipular datos en cadena Comparar cadenas Buscar caracteres y cadenas dentro de cadenas

Separar cadenas en tokens (separar cadenas en unidades logicas)

15

FUNCIONES DE LAS LIBRERIAS < STRING . H > Y < CTYPE . H >

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

< STRING . H >

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

< CTYPE . H >

isblank(c)

isdidit(c) islower(c) isupper(c) ispunct(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.

F UNCIONES PARA LA MANIPULACIN DE


18

CADENAS

DE LA LIBRERIA DE CABECERA STRING


Copia la cadenag s2 en el arreglo de caracter s1. Devuelve el valor de s1 .

char *strcpy( char *s1, const char *s2 );

char *strncpy( char *s1, const char *s2, size_t n );


char *strcat( char *s1, const char *s2 );

Copia los n caracteres de la cadena s2 en el arreglo de caracter s1. Devuelve el valor de s1 .


Aade la cadena s2 a la cadena s1. El primer carcter de s2 sobrescribe el carcter de termino nulo de s1. Devuelve el valor de s1 . Aade los n caracteres de la cadena s2 en la cadena s1. El primer caracter s2 de sobrescribe el carcter de termino nulo de s1. Devuelve el valor de s1 .

char *strncat( char *s1, const char *s2, size_t n );

F UNCIONES
19

PARA LA MANIPULACIN DE STRING

CADENAS DE LA LIBRERIA DE CABECERA

int strncmp( const char *s1, const char *s2, size_t n );

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.

int strcmp( const char *s1, const char *s2 );

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

PARA LA MANIPULACIN DE STRING

CADENAS DE LA LIBRERIA DE CABECERA

Copiando cadenas

char *strcpy( char *s1, const char *s2 )

Copia el segundo argumento en el primer argumento

El primer argumento debe ser grande para almacenar la cadena y el caracter nulo

char *strncpy( char *s1, const char*slmacenar 2, size_t n )

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:

strlen: cadena - -> int

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

Strcat(cadena_destino , cadena_origen ) char nombre*30+ = Jose, int b; . apellido*30+=Perez ;

Esta funcin concatena la cadena fuente a continuacin de la cadena destino.

b = strcmp(nombre,apellido); // devuelve un nmero negativo strcat(nombre, apellido); ...

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

return 0; // indicates successful termination } // end main


String to copy. Copia la cadena usnado Copia los strcpy . primeros 14 caracteresusando strncpy.

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

PARA LA MANIPULACIN DE STRING

CADENAS DE LA LIBRERIA DE CABECERA

Concatenar cadenas

char *strcat( char *s1, const char *s2 )


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

char *strncat( char *s1, const char *s2, size_t n )

Aade numeros especificos de caracters del segundo argumento al primer argumento


Aade el caracter nulo al resultado

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

s1 = Happy s2 = New Year


After strcat(s1, s2): s1 = Happy New Year s2 = New Year After strncat(s3, s1, 6): s1 = Happy New Year s3 = Happy After strcat(s3, s1): s1 = Happy New Year s3 = Happy Happy New Year

F UNCIONES
28

PARA LA MANIPULACIN DE STRING

CADENAS DE LA LIBRERIA DE CABECERA

Comparacin de cadenas

Los caracteres son representad0s como codigos numericos

Las cadenas se comparan usando codigos numericos

Codigos de caracter

ASCII

American Standard Code for Information Interchage

EBCDIC

Extended Binary Coded Decimal Interchange Code

F UNCIONES
29

PARA LA MANIPULACIN DE STRING

CADENAS DE LA LIBRERIA DE CABECERA


Comparando cadenas

int strcmp( const char *s1, const char *s2 )


Compara caracter por caracter


Devuelve

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

int strncmp( const char *s1, const char *s2, size_t n )


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;

<cstring> contiene el prototipo para strcmp y strncmp.

#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

Compara los 6 caracteres

} // 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

PARA LA MANIPULACIN DE STRING

CADENAS DE LA LIBRERIA DE CABECERA

Determina la longitud de la cadena

size_t strlen( const char *s )

Devuelve el numero de caractere de la cadena

El caracter nulo no est incluido en la longitud

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

The length of "abcdefghijklmnopqrstuvwxyz" is 26 The length of "four" is 4

Potrebbero piacerti anche