Sie sind auf Seite 1von 9

Universidad Tecnolgica Nacional Catedra de Infomtica 1

Facultad Regional Crdoba JTP Ing. Mascietti, Norma


Departamento Ingeniera en Electrnica PA Pereira, Mauro Alejandro

Cadena de caracteres

1. Fundamentos de cadenas y caracteres

Los caracteres son bloques de construccin fundamentales para los programas fuente. Un programa puede
contener constantes de carcter. Una constante de carcter es un valor int representado por un carcter entre comillas
sencillas. El valor de una constante de carcter es el valor entero del carcter en el conjunto de caracteres de la mquina.
Por ejemplo, 'z' representa el valor entero de z, y '\n' representa el valor entero de una nueva lnea.
Una cadena es un conjunto de caracteres tratados como una sola unidad. Una cadena puede incluir letras, dgitos
y varios caracteres especiales como +, -, *, y $. En C, las literales de cadena, o constanes de cadena, se escriben dentro de
comillas dobles de la siguiente manera:
Juan P. Prez (un nombre)
99999 de Eje Central (la direccin de una calle)

En C, una cadena es un arreglo de caracteres, los cuales terminan con el carcter nulo ('\0'). Se accede a una
cadena mediante un apuntador a su primer carcter. El valor de una cadena es la direccin del primer carcter. As, en C, es
apropiado decir que una cadena es un apuntador, de hecho, un apuntador al primer carcter de la cadena. En este sentido,
las cadenas son como arreglos, debido a que un arreglo tambin es un apuntador al primer elemento.
Un arreglo de caracteres o una variable de tipo char * puede inicializarse con una cadena en la definicin. Las
definiciones
char color[] = azul;
const char *ptrColor = azul;
inicializan una variable con la cadena azul. La primera definicin crea un arreglo de 5 elementos, color, que contiene
los caracteres 'a', 'z', 'u', 'l' y '\0'. La segunda variable crea una variable apuntador, ptrColor, que apunta a la cadena
azul en algn lugar de la memoria.
La definicin del arreglo anterior tambin podra escribirse como
char color[] = {'a', 'z', 'u', 'l', '\0'};
Cuando se define un arreglo para que contenga una cadena, ste debe ser lo suficiente grande para almacenar la cadena y
su carcter de terminacin nulo. La definicin anterior determina automticamente el tamao del arreglo, basndose en el
nmero de inicializaciones de la lista de inicializacin ('a', 'z', 'u', 'l', '\0').

No almacenar suficiente espacio en un arreglo de caracteres para almacenar el carcter nulo que termina una
cadena, es un error.

Si una cadena es ms grande que el arreglo de caracteres en el cual se va a almacenar, los caracteres ms all
del final del arreglo sobrescribirn los datos siguientes en la memoria del arreglo.

Una cadena puede almacenarse en un arreglo, por medio de scanf. Por ejemplo, la siguiente instruccin almacena
el arreglo de caracteres palabra[20]:
scanf( %s, palabra );
La cadena que introduce el usuario se almacena en palabra. Observe que palabra es un arreglo, el cual es, por supuesto,
un apuntador, de modo que no necesitamos un & con el argumento palabra. La funcin scanf leer caracteres hasta
encontrar un espacio, un tabulador, un indicador de nueva lnea o de fin de archivo. Observe que la cadena no debe ser
mayor que 19 caracteres para dejar espacio suficiente para el carcter de terminacin nulo. Para un arreglo de caracteres
que se imprimir como una cadena, el arreglo debe contener el carcter de terminacin nulo.
La cadena de caracteres est definida como un arreglo de caracteres, debido a que el nombre de un arreglo es la
direccin de memoria del primer elemento del arreglo, por lo que si se iguala el nombre del arreglo al nombre de un
puntero, a este puntero se le puede aplicar aritmtica de punteros (ver apunte Punteros) para poder desplazarse entre los
datos del arreglo.
Las funciones scanf() y printf() reconocen a los espacios introducidos con la barra espaciadora como finales de
cadena. Esto puede solucionarse usando las funciones gets() y puts() incluidas en la librera ctype.h

1
Universidad Tecnolgica Nacional Catedra de Infomtica 1
Facultad Regional Crdoba JTP Ing. Mascietti, Norma
Departamento Ingeniera en Electrnica PA Pereira, Mauro Alejandro

2. Funciones de manipulacin de cadenas de la biblioteca de manipulacin de cadenas

La biblioteca de manipulacin de cadenas (<string.h>) proporciona muchas funciones tiles para manipular datos
de cadenas (copiar y concatenar cadenas), comparar cadenas, buscar caracteres y otras cadenas dentro de cadenas,
separar cadenas en tockens (separar cadenas en sus piezas lgicas) y determinar la longitud de cadenas. Vamos a ver
algunas de ellas.

Prototipos de funcin Descripcin de la funcin


char *strcpy (char *s1, const char *s2) Copia la cadena s2 dentro del arreglo s1. Devuelve el valor de s1.

char *strncpy (char *s1, const char *s2, size_t n) Copia al menos n caracteres de la cadena s2 dentro del arreglo s1. Devuelve el valor
de s1n.

char *strcat (char *s1, const char *s2) Agrega la cadena s2 al arreglo s1. El primer carcter de s2 sobrescribe al carcter de
terminacin nulo de s1. Devuelve el valor de s1.

char *strcat (char *s1, const char *s2, size_t n) Agrega al menos n caracteres de la cadena s2 al arreglo s1. El primer carcter de s2
sobrescribe al carcter de terminacin nulo de s1. Devuelve el valor de s1.

En la funcin strcpy, s1 (un arreglo de caracteres) debe ser lo suficientemente grande para almacenar la cadena
s2 y el carcter de terminacin nulo, el cual tambin se copia.
Observe que en la funcin strncpy, un carcter de terminacin nulo se escribe solamente si el nmero de
caracteres a copiar (en s1) es al menos mayor en uno que la longitud de la cadena (s2). Por ejemplo, si
prueba es el segundo argumento, se escribe un carcter de terminacin nulo slo si el tercer argumento de
strncpy, es al menos 7 (seis caracteres en prueba ms el carcter de terminacin nulo). Si el tercer argumento
es mayor que 7, el carcter nulo se agrega al arreglo hasta que se escriben el nmero total de caracteres
especificados en el tercer argumento.
Al usar la funcin srtcat, el primer carcter del segundo argumento remplaza el nulo ('\0') que termina la cadena
del primer argumento. El programador debe asegurarse de que el arreglo utilizado para almacenar la primera
cadena es lo suficientemente grande para almacenar la primera cadena, la segunda cadena y el carcter de
terminacin nulo copiado desde la segunda cadena.
La funcin strncat agrega un carcter de terminacin nulo automticamente al resultado.

Un error comn de programacin es no agregar el carcter de terminacin nulo al primer argumento de


strncpy, cuando el tercer argumento es menor o igual que la longitud de la cadena del segundo argumento.

La figura 2.1 utiliza strcpy para copiar la cadena completa del arreglo x dentro del arreglo y, y utiliza strncpy
para copiar los primeros 14 caracteres del arreglo x dentro del arreglo z. Se agrega un carcter nulo ('\n') al arreglo z,
debido a que la llamada a strncpy en el programa no escribe un carcter de terminacin nulo (el tercer argumento es
menor que la longitud de la cadena del segundo argumento).

2
Universidad Tecnolgica Nacional Catedra de Infomtica 1
Facultad Regional Crdoba JTP Ing. Mascietti, Norma
Departamento Ingeniera en Electrnica PA Pereira, Mauro Alejandro

La Figura 2.2 muestra las funciones strcat y strncat.

3. Funciones de comparacin de la biblioteca de manipulacin de cadenas

Prototipos de funcin Descripcin de la funcin


int strcmp ( const char *s1, const char *s2 ); Compara la cadena s1 con la cadena s2. La funcin devuelve 0, menor que 0,
o mayor que 0, si s1 es igual, menor, o mayor que s2, respectivamente.

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 0, menor que 0, o mayor que 0, si s1 es igual, menor, o mayor que
s2, respectivamente.

Un error comn de programacin es suponer que strcmp y strncmp devuelven 1 cuando sus argumentos son
iguale, ambas funciones devuelven 0.

Cmo sabe la computadora que una letra en particular va antes que otra? Todos los caracteres se representan en
la computadora como cdigos numricos (ver Cdigos de los caracteres de ASCII), cuando la computadora compara dos
cadenas, en realidad compara los cdigos numricos de los caracteres de las cadenas.
Observe la Figura 3.1 con las funciones strcmp y strncmp.

3
Universidad Tecnolgica Nacional Catedra de Infomtica 1
Facultad Regional Crdoba JTP Ing. Mascietti, Norma
Departamento Ingeniera en Electrnica PA Pereira, Mauro Alejandro

4. Funciones de bsqueda de la biblioteca de manipulacin de cadenas

Prototipos de funcin Descripcin de la funcin


char *strchr( const char *s, int c );
Localiza la primera ocurrencia del carcter c en la cadena s. Si se localiza c, se devuelve un apuntador a c
en s. De lo contrario, se devuelve un apuntador NULL.

size_t strcspn( const char *s1, const char *s2 );


Determina y devuelve la longitud del segmento inicial de la cadena s1, que consiste en los caracteres no
contenidos de la cadena s2.

size_t strspn( const char *s1, const char *s2 );


Determina y devuelve la longitud del segmento inicial de la cadena s1, que consiste slo en los caracteres
contenidos en la cadena s2.

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


Localiza la primera ocurrencia en la cadena s1 de cualquier carcter de la cadena s2. Si se localiza un
carcter de la cadena s2, se devuelve un apuntador al carcter de la cadena s1. De lo contrario, se devuelve un apuntador NULL.

char *strrchr( const char *s, int c );


Localiza la ltima ocurrencia de c en la cadena s. Si se localiza a c, se devuelve un apuntador a c en la
cadena s. De lo contrario, se devuelve un apuntador NULL.

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


Localiza la primera ocurrencia en la cadena s1 de la cadena s2. Si se localiza la cadena, se devuelve un
apuntador a la cadena en s1. De lo contrario, se devuelve un apuntador NULL.

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


Una secuencia de llamadas a strtok separa la cadena s1 en tokens (piezas lgicas como palabras de una
lnea de texto) separados por caracteres contenidos en la cadena s2. La primera llamada contiene s1 como el primer argumento, y las llamadas
subsiguientes contienen a NULL como el primer argumento, para continuar separando la misma cadena. Un apuntador al token actual es devuelto por
cada llamada. Si no hay ms tokens cuando se llama a la funcin, se devuelve NULL.

La Figura 4.1 utiliza strchr para buscar la primera ocurrencia de 'a' y la primera ocurrencia de 'z' en la cadena
Esta es una prueba.

4
Universidad Tecnolgica Nacional Catedra de Infomtica 1
Facultad Regional Crdoba JTP Ing. Mascietti, Norma
Departamento Ingeniera en Electrnica PA Pereira, Mauro Alejandro

La funcin strcspn determina la longitud de la parte inicial de la cadena correspondiente a su primer argumento,
la cual no contiene carcter alguno de la cadena de su segundo argumento. La funcin devuelve la longitud del segmento.

La Figura 4.3 muestra un programa que localiza la primera ocurrencia en cadena1 de cualquier carcter de
cadena2.

La Figura 4.4 muestra un programa que busca la ltima ocurrencia del carcter 'z' en la cadena Un zoo tiene
muchos animales, incluso zebras.

5
Universidad Tecnolgica Nacional Catedra de Infomtica 1
Facultad Regional Crdoba JTP Ing. Mascietti, Norma
Departamento Ingeniera en Electrnica PA Pereira, Mauro Alejandro

La funcin strspn (Figura 4.5) determina la longitud de la parte inicial de una cadena que se encuentra en su
primer argumento, y que contiene slo caracteres de la cadena en su segundo argumento. La funcin devuelve la longitud
del segmento.

La Figura 4.6 utiliza strstr para encontrar la cadena def en la cadena abcdefabcdef.

La funcin strtok (Figura 4.7) se utiliza para separar una cadena en una serie de tokens. Un token es una
secuencia de caracteres separados por demilitadores (generalmente espacios o marcas de puntuacin). Por ejemplo, en una
lnea de texto, cada palabra puede considerarse como un token, y los espacios que separan a las palabras pueden
considerarse delimitadores.

6
Universidad Tecnolgica Nacional Catedra de Infomtica 1
Facultad Regional Crdoba JTP Ing. Mascietti, Norma
Departamento Ingeniera en Electrnica PA Pereira, Mauro Alejandro

Para separar una cadena en tokens (suponiendo que la cadena contiene ms de un token), se necesitan mltiples
llamadas a strtok. La primera llamada a strtok contiene dos argumentos, una cadena que va a separarse en tokens, y una
cadena que contiene caracteres que separan los tokens. En la Figura 4.7, la instruccin ptrToken = strtok( cadena, );
asigna a ptrToken un apuntador al primer token en la cadena. En segundo argumento de strtok, , indica que los tokens
de la cadena estn separados por espacios. La funcin strtok busca el primer carcter de la cadena que no sea un carcter
delimitador

5. Ejercitacin
EJEMPLO 1: Escriba un programa que inicialice un arreglo de caracteres con la palabra electronica, luego
otro arreglo que se inicialice con la misma palabra pero con el fin de cadena localizado antes de la n.Imprima los dos
arreglos y observe las diferencias.

#include <stdio.h>

int main (void)


{
char cadena1[]={'e','l','e','c','t','r','o','n','i','c','a','\0'};
char cadena2[12]={'e','l','e','c','t','r','\0','n','i','c','a'};

printf("La cadena entera es\n\t\t");


puts(cadena1);
printf("La cadena con el fin desplazado es\n\t\t");
puts(cadena2);

EJEMPLO 2: Escriba un programa que me permita introducir una cadena de caracteres y luego, mediante una
funcin, convierta la primer letra en mayscula y las siguientes 49 en letras minsculas.

#include <stdio.h>
#include <ctype.h> //para las funciones toupper y tolower

#define MAXCADENA 50

void ConvertirLetras(char *cadena);

int main (void)


{
char cadena[MAXCADENA+1];
printf("\nEscriba una cadena de hasta %d caracteres, "
"luego presione ENTER:\n\n\n\t", MAXCADENA);
gets(cadena);

ConvertirLetras(cadena);

printf("\n\t%s\n\n\n", cadena);

system ("PAUSE");
return 0;
}

void ConvertirLetras(char *cadena)

7
Universidad Tecnolgica Nacional Catedra de Infomtica 1
Facultad Regional Crdoba JTP Ing. Mascietti, Norma
Departamento Ingeniera en Electrnica PA Pereira, Mauro Alejandro

*cadena = toupper (*cadena);

while (*cadena != '\0')


{
cadena=cadena+1;
*cadena = tolower(*cadena);
}
}

EJEMPLO 3: Escriba un programa que cuente la cantidad de letras a y (espacios) que se repiten. Luego,
cambiar cada por un guin bajo.

#include <stdio.h>

int main (void)


{
char cadena[] = "Me encanta informatica I";
char *p, *q;
int espacios=0, letras_a=0;

p = cadena;
q = cadena;
while (*p != '\0')
{
if (*p==' ') espacios++;
if (*p=='a') letras_a++;
p++;
}
printf( "De la cadena: \"%s\" , podemos saber que hay:\n\n", cadena );
printf( "\t %i espacios\n", espacios );
printf( "\t %i letras a\n", letras_a );

printf( "\nReemplazando los espacios por guiones bajos, la cadena nos queda:\n",
cadena );
system ("PAUSE");

while (*q!='\0')
{
if (*q==' ') *q = '_';
q++;
}
printf( "\n\n\t\"%s\" \n\n\n", cadena );
system ("PAUSE");
return 0;
}

8
Universidad Tecnolgica Nacional Catedra de Infomtica 1
Facultad Regional Crdoba JTP Ing. Mascietti, Norma
Departamento Ingeniera en Electrnica PA Pereira, Mauro Alejandro

EJEMPLO 4: Escriba un programa que me permita introducir una palabra y luego convierta las letras a
maysculas y a minsculas alternativamente.

#include <stdio.h>
#include <ctype.h>

int main()
{
char palabra[100];
int i=0;

printf("Escriba una palabra\n\n: ");


gets(palabra);
printf("\n\nLa palabra alternada entre mayusculas y minusculas queda\n\n: ");
while (palabra[i]!='\0')
{
if ( (i % 2) == 0)
printf("%c", toupper(palabra[i]));
else
printf("%c", tolower(palabra[i]));
i++;
}
printf( "\n\n\n" );
system( "PAUSE" );
return 0;
}

Das könnte Ihnen auch gefallen