Está en la página 1de 7

UNIVERSIDAD NACIONAL DE INGENIERIA

Facultad de Ingeniera Industrial y de Sistemas


Curso : ST202 LENGUAJE DE PROGRAMACIN ESTRUCTURADO
Prof. Ing. Gilberto A. SALINAS A.
1.

TRATAMIENTO DE CADENAS

El BORLAND C++ V5.02, y DEV C++ incluyen el archivo de cabecera string.h y contiene una treintena de
rutinas pertenecientes a la familia str y que estn agrupadas en cinco categoras, dependiendo del tipo de accin
que realizan.
Las cadenas de C son vectores de caracteres (elementos de tipo char) con una peculiaridad: el texto de la cadena
termina siempre en un carcter nulo. El carcter nulo tiene cdigo ASCII 0 y podemos representarlo tanto con
el entero 0 como con el carcter \0 (recuerda que \0 es una forma de escribir el valor entero 0). Ojo! No
confundas \0 con 0: el primero vale 0 y el segundo vale 48.
Declaracin de Cadenas
Esta cadena, por ejemplo, se declara con capacidad para almacenar 10 caracteres:
char a[10];

Podemos inicializar la cadena con un valor en el momento de su declaracin:


char a[10] = "cadena";
Lectura de cadenas.
Hasta ahora hemos estado utilizando para entrada de datos la funcin scanf (), para cadenas debemos utilizar scanf (%s,
a), esta funcin termina cuando encuentra un espacio en blanco o un fin de cadena lo cual no nos va permitir ingresar
cadenas con espacios en blanco por ejemplo: Juan Perez. Pero esto tiene solucin, veamos:
La funcin gets()
Lee una cadena desde el teclado incluyendo espacios en blanco hasta encontrar la marca de fin cadena, fin de archivo o
tambin presionando ENTER para indicar que se ha terminado de ingresar la cadena
El parmetro de la funcion gets() ha de ser una variable de tipo cadena con suficiente espacio para guardar la cadena en
cuestin:
Char Cad[80]; podemos leer: gets(Cad); pudiendo ser Cad = Hola Mundo;

#include <>
//#define Max 20
int const Max = 20;
int main() // gets()
{
char Cod[Max], Nombre[Max];
printf("Ingrese el Codigo ---> ");
gets(Cod);
printf("Ingrese el Nombre ---> ");
gets(Nombre);
system("cls");
printf("Codigo : %s\n", Cod);
printf("Nombre : %s\n", Nombre);
system("PAUSE");
return (0);

#include <>
int main() // getchar()
{
char Car;
int Ctdor = 0;
//while((Car = getchar())!=EOF)
//while((Car = getchar())!='\r')
while((Car = getchar())!='\n')
if(Car == 'a')
Ctdor = Ctdor+1;
printf("%d letras a\n", Ctdor);
system("PAUSE");
return (0);
}

}
La funcin getchar()
Se utiliza getchar() para leer carcter a carcter.

Representacin de las cadenas en memoria


A simple vista, "cadena" ocupa 6 bytes, pues contamos en ella 6 caracteres, pero no es as. En realidad, "cadena"
ocupa 7 bytes los 6 que corresponden a los 6 caracteres ms uno correspondiente a un carcter nulo al final, que
se denomina la marca de fin de cadena y es invisible para el usuario.
Al declarar e inicializar una cadena as:
char a[10] = "cadena";

En la memoria queda de este modo:


a

\0

Es decir, es como si hubisemos inicializado la cadena de este otro modo equivalente:


char a[10] = { c, a, d, e, n, a, \0 };

Recuerda, hay dos valores relacionados con el tamao de una cadena:


Capacidad, que es la dimensin del vector de caracteres;
Longitud, que es el nmero de caracteres que contiene, sin contar el terminador de la cadena. La longitud
de la cadena debe ser siempre estrictamente menor que la capacidad del vector para no desbordar la
memoria reservada.
Lo normal al trabajar con una variable de tipo cadena es que su longitud vare conforme evoluciona la ejecucin
del programa, pero el tamao de un vector es fijo. Por ejemplo, si ahora tenemos en a el texto "cadena" y mas
tarde decidimos guardar en ella el texto "texto", que tiene un carcter menos, estaremos pasando de esta
situacin:
Una cadena de longitud uno no es una cadena. Hemos dicho en el acpite anterior que una cadena de un slo
carcter, por ejemplo "y ", no es lo mismo que un carcter, por ejemplo y. La diferencia estriba en que "y " ocupa dos bytes,
el que corresponde al carcter y y el que corresponde al carcter nulo \0, mientras que y ocupa un solo byte.
La declaracin de variables:
char a = y;
char b[2] = y;
He aqu una representacin grfica de las variables y su contenido:

b
a

\ 0

En esta separata no se han detallado todas esas funciones, tampoco se hace un detalle exhaustivo de cada una de
ellas. La AYUDA (help) del BORLAND es interesante, en el IDE de C seleccione una instruccin y presione
CTRL+F1 y obtendr suficiente informacin relacionada con dicha instruccin.
En esta se detallan programas con algunas de las funciones mencionadas de las siguientes categoras:
Cambio
Comparacin
Concatenacin
Copiado/Modificacin
Bsqueda
Se deja al lector como ejercicio para aquellas funciones no implementadas.
Para cada uno de las diferentes funciones vamos a definir algunos parmetros que usaremos en cada una de las
aplicaciones:
Cad
Cad1
Cdes
Cori
Nc
C
Eb

:
:
:
:
:
:
:

UNI-FIIS

Cadena de caracteres
Cadena de caracteres
Cadena de caracteres destino
Cadena de caracteres origen
Numero de caracteres
Carcter
Carcter espacio (Carcter blanco)
G. A. SALINAS A.

Tratamiento de Cadenas de Caracteres

2 de 7

1.1 CATEGORIA CAMBIO/MODIFICACION


En esta categora se encuentran las siguientes funciones:
strlwr (*Cad)
strupr (*Cad)
strset (*Cad, C)
strnset (*Cad, C, Nc)
strrev (*Cad)
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream.h>
//puede usar system(cls); por clrscr();
void main()
{
char *Cad = "xyzLimaQue*NoPeK";
//clrscr();
system(cls);
char *pc;
//Puntero a caracter
char c = 'Q';
char c1= '#';
strcpy(pc, Cad);
cout<<"Cadena Inicial de pueba\n";
puts(pc);
cout<<"Ahora la cadena en minusculas\n";
strlwr(pc);
puts(pc);
cout<<"Ahora la cadena en Mayusculas\n";
strupr(pc);
puts(pc);
cout<<"Ahora la cadena con el caracter : \n"<< c;
strset(pc, c);
puts(pc);
cout<<"Ahora la Cadena con el caracter \n"<<c1;
strnset(pc,c1,6);
puts(pc);
cout<<"Ahora la cadena en Reversa\n";
strcpy(Cad,pc);
strrev(Cad);
puts(Cad);
getch();
}
1.2 CATEGORIA DE COMPARACION
Es esta categora se tiene las siguientes funciones:
strcmp (*Cad, *Cad1)
stricmp (*Cad, *Cad1)
strcmpi (*Cad, *Cad1)
strncmp(*Cad, *Cad1, Nc)
strnicmp(*Cad, *Cad1, Nc)
En esta categora son las cadenas Cad y Cad1 que se comparan lexicogrficamente, devuelve un entero y
se interpreta de la siguiente forma si es:
(-1) NEGATIVO ===> Cad < Cad1
( 0) CERO
===> Cad = Cad1
(+1) POSITIVO ===> Cad > Cad1

UNI-FIIS

G. A. SALINAS A.

Tratamiento de Cadenas de Caracteres

3 de 7

Las tres primeras funciones efectan la comparacin entre el total de los caracteres de las cadenas Cad y
Cad1 teniendo en cuenta el tipo, mientras que las dos ultimas efectan la comparacin de la subcadena de
Nc caracteres.
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream.h>
#include<ctype.h>
void Compara(int a);
void main()
{
char *Cad = "UNIFIIS";
clrscr();
int x;
char *Cad1;
//Puntero a caracter
do
{
cout<<"Si desea continuar ....\n";
cout<<"Digite las iniciales de su Ecuela\n";
gets(Cad1);
}while(strcmp(Cad, Cad1));
cout<<"Bienvenido a tratamiento de cadenas\n";
// Compara independientemente del tipo de caracter
Cad1 = "unifiis";
x=stricmp(Cad,Cad1);
printf("x = %d\n", x);
printf("Cad: %s Cad1: %s\n", Cad, Cad1);
Compara(x);
//Compara teniendo en cuenta el tipo de caracter
Cad1 = "eapisa";
x=strcmp(Cad,Cad1);
printf("x = %d\n", x);
printf("Cad: %s Cad1: %s\n", Cad, Cad1);
Compara(x);
//Compara solo un numero determinado de carateres
Cad = "Lima la Horrible";
Cad1= "Limamanta Pacha";
x = strncmpi(Cad, Cad1, 4);
printf("x = %d\n", x);
printf("Cad: %s Cad1: %s\n", Cad, Cad1);
Compara(x);
getch();
}
void Compara(int a)
{
if(a == 0)
printf("Las Cadenas son iguales\n\n");
else
if(a<0)
printf("Cad es Menor a Cad1\n\n");
else
printf("Cad es Mayor a Cad1\n\n");
}

1.3 CATEGORIA DE CONCATENACION

UNI-FIIS

G. A. SALINAS A.

Tratamiento de Cadenas de Caracteres

4 de 7

En esta categora se usan para aadir desde una cadena origen Cori a una cadena destino Cdes, para los
cuales se tienen las siguientes funciones:
strcat (*Cdes,*Cori)
strncat (*Cdes, *Cori, Nc)
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream.h>
#define Max 80
void main()
{
int Nc;
char Cdes[Max] = "Ceviche";
clrscr();
char Cori[Max] = "Mixto....";
char Cad1[Max];
char Cad[Max]="UNIFIIS";
do
{
cout<<"Si desea continuar ....\n";
cout<<"Digite las iniciales de su Ecuela\n";
gets(Cad1);
}while(strcmp(Cad, Cad1));
cout<<"BIENVENIDO A TRATAMIENTO DE CARACTERES\n\n";
strcpy(Cad,Cdes);
printf("Cad = %s\n",Cad);
puts(Cdes);
//Se Concatena Nc caracteres de Cori cada vez
for(Nc=0;Nc<9;Nc++)
{
strcpy(Cdes,Cad);
strncat(Cdes,Cori, Nc);
puts(Cdes);
}
getch();
// Investigar strdup(), stpcpy() y presente aplicaciones.
}
1.4 CATEGORIA DE COPIADO
Las funciones de esta categora se usan para el copiado desde una cadena origen Cori a una cadena destino
Cdes veamos:
strcpy(*Cdes, *Cori) //Copia el contenido de Cori en Cdes
strpcpy(*Cdes,*Cori) //Lo mismo a la anterior pero devuelve un apuntador al final de Cdes
strncpy(*Cdes, *Cori, Nc)//Lo mismo al anterior pero Copia hasta Nc caracteres
strdup(*Cad)
//Asigna suficiente memoria para almacenar una copia de Cad.
Las dos primeras funciones copian de la cadena origen a la cadena destino. La tercera copia un numero Nc
de caracteres de la cadena origen a la cadena destino.
La ltima funcin asigna suficiente memoria para guardar un duplicado de la cadena de caracteres Cad que
debe asignarse a una variable de ese tipo, devolviendo un puntero a esa variable.
#include<string.h>
#include<>
#define Max 80
void main()
{
UNI-FIIS

G. A. SALINAS A.

Tratamiento de Cadenas de Caracteres

5 de 7

int Nc;
clrscr();
char Cdes[Max], Cori[Max], Cad[Max], Eb;
char *pc;
Eb = ' ';
cout<<"INGRESE UNA CADENA DE CARACTERES\n";
gets(Cori);
cout<<"AHORA SE HA COPIADO EN Cdes\n";
strcpy(Cdes, Cori);
printf("Cdes : %s, Cori : %s \n", Cdes, Cori);
printf("Y EN LA DIRECCION : %p\n\n",Cdes);
cout<<"LA CADENA ORIGEN SE COPIA CON strdup()\n";
pc = strdup(Cori);
cout<<"Cori : "<<Cori<<"\n";
printf("En la direccion %p : \n\n",pc);
cout<<"AHORA LA CADENA SE COPIA CON strncpy\n";
free(pc);// libera memoria
Cdes[Max] = ' ';
printf("Cdes : ", Cdes);
for(Nc=0;Nc<strlen(Cori);Nc++)
{
strset(Cdes,Eb);
strncpy(Cdes,Cori,Nc+1);
//puts(Cdes);
printf("%s",Cdes);
}
//Cdes[Nc+1] = '\0';
getch();
}
1.5 CATEGORIA DE BUSQUEDA
En esta categora tenemos las siguientes funciones:
strchr (*Cad, C) (1)
strrchr (*Cad, C) //Lo mismo al anterior devuelve un apuntador a la ultima ocurrencia.
strcspn (*Cad, *Cad1) (3)
strpbrk(*Cad, *Cad1) (4)
strspn (*Cad, *Cad1) (5)
strtok (*Cad, *Cad1) (6)
strstr (*Cad, *Cad1) (7)
(1) Devuelve un apuntador a la primera ocurrencia del byte menos significativo de C en la cadena apuntada
por Cad. (3) Devuelve un apuntador del primer carcter en la cadena apuntada Cad, que no se corresponde
con ningn carcter de la cadena apuntada por Cadl nulo en otro caso. (4) Devuelve un apuntador al
primer carcter de la cadena apuntada por Cad que se corresponde con algn carcter de la cadena apuntada
por Cadl, y nulo en otro caso.(5)devuelve la longitud de la subcadena inicial de la cadena apuntada por Cad
que esta constituida solo por aquellos caracteres contenidos en la cadena apuntada por Cadl. (6) devuelve un
apuntador a la siguiente palabra de la cadena apuntada por Cad. (7) devuelve un apuntador a la primera
ocurrencia en la cadena apuntada por Cad de la cadena apuntada por Cadl, nulo en otro caso.
#include<string.h>
#include<iostream.h>

#define Max 80
void main()
{
int Nc;
clrscr();
char *Cad = " Martha Cerra Lima";
UNI-FIIS

G. A. SALINAS A.

Tratamiento de Cadenas de Caracteres

6 de 7

char *Cad1= "Lima la horrible";


char C, *pc;
int L, y;
C = 'a';
cout<<"El puntero a la primera Ocurrencia de C en Cad \n";
pc = strchr(Cad, C);
printf(" pc = %p\n\n",pc);
cout<<"Cad = "<<Cad<<"\n";
cout<<"Cad1 = "<<Cad1<<"\n\n";
pc = strpbrk(Cad, Cad1);
if(pc)
{
cout<<"Primera ocurrencia de un caracter "<<pc<<"\n";
}
else
{
cout<<"No hay ocurrencia de ningun caracter\n\n";
}
cout<<strstr(Cad, "Lima")<<" Es la primera ocurrencia de la Subcadena\n";
getch();
}
BIBLIOGRAFA
SHILDT, Herbert
1994 C Gua de Auto Enseanza. McGraw Hill. Mexico D.F.
SHILDT, Herbert
1993 TURBO C/C++ 3.1 MANUAL DE REFERENCIA. McGraw Hill. Madrid

UNI-FIIS

G. A. SALINAS A.

Tratamiento de Cadenas de Caracteres

7 de 7