Sei sulla pagina 1di 15

Conceptos Bsicos de caracteres y cadenas Librera de Manejo de Caracteres (ctype.

.h) Funciones isalpha, isupper, islower, isdigit, isspace, ispunct, isalnum, toupper, tolower Manejo de Cadenas Librera de manejo de cadenas (string.h)

Cadenas de Caracteres

Es una conjunto de caracteres colocados en secuencia String: Una abstraccin


Es un tipo de dato construido sobre una realidad Oculta una cierta complejidad, el verdadero concepto de una cadena Una cadena realmente se visualiza:

\0

La interfaz string.h nos permite usar la abstraccin string Incluye las funciones necesarias para operaciones con cadenas de caracteres

Representacin de Cadenas de Caracteres

Hasta ahora hemos tratado a las cadenas como una sola


entidad llamada string El tipo string, no existe realmente en C, es una abstraccin

Tipo de Dato creado, para facilitar el trabajo con cadenas

En realidad las cadenas pueden visualizarse de tres formas diferentes:


Como arreglo de caracteres

Como un puntero al primer caracter de un arreglo


Como una entidad completa, con integridad propia (string)

Esta ultima es la abstraccin que hemos estado usando

Cadenas como Arreglos

Al ver una cadena, notamos que es un conjunto de caracteres, un grupo de datos del mismo tipo, y cada uno ocupa una posicin secuencial en memoria Una cadena es un arreglo de caracteres Ejemplo:

Se necesita espacio en memoria para almacenar la cadena Hola, El computador le asigna las direcciones del 1000 al 1003 La cadena Mundo tiene 5 caracteres El computador encuentra que las direcciones a partir del 1004 estn vacas Donde termina Hola y donde comienza Mundo? Para reconocer hasta donde llega el contenido valido de una cadena, se debe ubicar como ultimo

1000 1000 1001 1001 1002 1002 1003 1003 1004 1004 1005 1005 1006 1006 1007 1007 1008 1008 1009 1010

H H o o l l a a M \0 u M n u d n o d o \0

Cadenas como Arreglos


char cadena[10];

Pide espacio para 10 caracteres en memoria(10 bytes), de los cuales 9 se pueden usar, el ultimo seria para el caracter nulo. Muy probablemente no se usaran los 9 espacios. Ejemplo:

cadena[0] = M cadena[1]=a cadena[2] = M cadena[3] = a cadena[4] = \0

Para acceder a todos los miembros de este arreglo, se puede hacer un lazo desde 0 hasta el elemento revisado sea igual a \0

for(i = 0; cadena[i] !=\0; i++){ }

/*proceso con cada caracter cadena[i]*/

Aunque tambin se puede usar la funcin strlen for(i = 0; i < strlen(cadena);i++){

/*proceso con cada carcter cadena[i]*/

Interface string.h

string.h es una interface de C que incluye herramientas para manipulacin de cadenas.


Copia el contenido de s2(carcter por carcter) en s1, devuelve s2. Para copiar cadenas, se usa esta funcion, jamas se usa el operador = Copia caracater a caracter se s2 a s1, pero solo el numero de caracteres indicado por n. Si la longitud de s2 es mayor o igual a la de s1, esta funcion no aade el carcter nulo a s1. Hay que hacerlo manualmente Concatena s1 con s2, devuelve s1 ya concatenada Concatena s1 con la porcion de s2 indicada por n Compara s1 con s2 Si s1 > s2 devuelve un valor >0 Si s1 < s2 devuleve un valor <0 Si s1 == s2 devuelve 0 Compara por lo menos los n primeros caracteres de ambas cadenzas, y devuelve lo mismo que la anterior Devuelve la longitud de la cadena s Devuelve un puntero al elemento de la cadena s1 que contiene el carcter c Si no se encuentra c, devuelve NULL Devuelve un puntero al elemento de la cadena s1 donde comienza la cadena s2 Si no se encuentra s2 devuelve NULL

string strcpy(string s1, string s2); string strncpy(string s2, string s2, int n); string strcat(string s1, string s2); string strncat(string s2, string s2, n); int strcmp(string s1, string s2);

int strncmp(string s1, string s2,int n) int strlen(string s); string strchr(string s1, char c); string strstr(string s1, string s2);

Ejercicio

Escribir la funcin PosPrimeraVocal, usando cadenas como arreglos.


int PosPrimeraVocal(char cad[]) { int i; for(i = 0; i < strlen(cad);i++){ if(EsVocal(cad[i]) return(i);
La funcin recibe la cadena, como si fuese un arreglo de caracteres

}
return(-1); }

Cadenas como Punteros


int A[10], *p; p = &A[0]; /* p apunta al primer elemento, tambin se podra escribir p = A */ Si una cadena es una arreglo de caracteres, un puntero al primer elemento tambin servira para trabajar con dicha cadena char cadena[10]; char *p; p = cadena; /*p apunta al primer elemento*/ p++; /*p apunta al segundo elemento*/ Para acceder a cada elemento se usara un for desde el primer elemento hasta que el elemento apuntado sea diferente de \0 for(p = cadena; *p != \0; p++){ /* proceso para cada elemento *p */ }
cadena p

H o 0 1

l 2

a \0 3 4

Ejercicio

Escribir la funcin PosPrimeraVocal usando cadenas como un puntero al primer elemento. int PosPrimeraVocal(char *cad) { char *p; for(p = cad; *p!=\0;p++){
La funcin recibe la cadena, como un puntero al primer carcter.

if(EsVocal(*p) return(p);
} return(-1);
*p es equivalente a cad[i], dependiendo de a qu caracter apunta p. Este se ubica al inicio, es decir en cad, y se mueve de uno en uno (p++)

Paso de Cadenas como Parmetros

Como cadena de arreglos: int PosPrimeraVocal(char cadena[]); No necesitamos pasar el tamao de la cadena, pues s sabemos hasta dnde llegaremos en un for, hasta que encontremos \0 Como puntero a un caracter int PosPrimeraVocal(char *cadena); Como string int PosPrimeraVocal(string cadena); Las tres formas de funciones significan lo mismo, se puede utilizar cualquiera indistintamente Se puede comenzar considerando a la cadena como un arreglo, y luego en el mismo programa, visualizarla como un puntero, o como un string

Paso de Cadenas como Parmetros


Existen diferencias bsicas que se debe reconocer


Si declara: char cadena[10]; Esta pidiendo 10 bytes de memoria, contiguos y trabajando con un arreglo. A un arreglo no se le puede asignar datos, cadena = Espol; /*ES IMPOSIBLE*/ Si declara: char *cadena; No esta pidiendo nada de memoria aun La memoria se DEBER pedir cuando se necesite crear una nueva cadena: cadena = malloc(10); Pide 10 bytes contiguos para cadena En ese momento cadena apunta al primer elemento de un grupo de 10 elementos contiguos

Una cadena, declarada de cualquiera de las tres formas, puede mas tarde, ser tratada, con cualquiera de las tres formas

int i; string cadena; char *p; cadena = "HOLA MUNDO";


printf("El primer caracter es:%c\n", cadena[0]); printf("El segundo caracter es:%c\n", *(cadena+1)); printf("El tercer caracter es:%c\n", IthChar(cadena,2));

Se pueden usar cualquiera de las tres formas para imprimir un carcter

for(p = cadena; *p != '\0';p++) { printf("%c\n",*p); }

Cualquiera de las tres formas se pueden usar, es indistinto, pues las tres significan lo mismo

for(i = 0; i < strlen(cadena);i++){ printf("%c o tambien %c\n",cadena[i], IthChar(cadena,i)); }

for(i = 0; i < StringLength(cadena);i++){ printf("%c o tambien %c\n",cadena[i], IthChar(cadena,i)); }

Ejercicio

Implemente la funcin strcpy

strcpy, copia caracter a caracter de una cadena fuente a una cadena destino. Se puede implementar como punteros, o como arreglos
char *strcpy(char destino[], char fuente[]) { int i; for(i = 0; fuente[i]!=\0;i++){ destino[i] = fuente[i]; } destino[i] = \0; }

char *strcpy(char *destino, char *fuente) { char *p,*q; q = destino; for(p = fuente; *p!=\0;p++){ *q = *fuente; q++; } *q = \0; }

Ejercicio

Implemente la funcin InvertirNombre que recibe un nombre completo, y lo muestra de la siguiente forma: Apellido, nombre. Por ejemplo: Charles Babbage Babbage, Charles Aqu la clave es encontrar el espacio en blanco. Con este ya podemos dividir el nombre en dos: Desde uno despus del espacio en blanco Desde el inicio hasta antes del espacio en blanco Y luego pegar las dos subcadenas, pero al revs Para encontrar el espacio en blanco: Un caracter en una cadena, se usa strchr, que devuelve un puntero al carcter encontrado

Funciones que manipulan cadenas, y dan como resultado una cadena existente, pero manipulada, usualmente retornan dicha cadena ya existente y manipulada, como puntero
La funcin recibe el nombre, y la cadena, donde ira la versin invertida (paso por referencia)

char *InvertirNombre(char *nombre, char *invertido){ char *ap;

ap = strchr(nombre, );
if(ap == NULL) strcpy(invertido, nombre); else{ strcpy(invertido,ap+1); strcat(invertido, , ); } return(invertido); }

Se busca el espacio en blanco. La funcin retorna un puntero al elemento encontrado


Si no se encontr el espacio en blanco, la cadena invertida ser igual a la original
ap apunta hacia el espacio en blanco, ap+1 apunta al siguiente caracter. Desde all se copia en invertido (el apellido) A invertido, que contiene el apellido, se le concatenara la primera parte de nombre (desde el inicio hasta el espacio en blanco). Se usa strncat, para especificar cuanto se quiere copiar. Se calcula cuanto usando aritmtica de punteros ( el total de desfases entre nombre y ap)

strncat(invertido,nombre, ap-nombre);

Potrebbero piacerti anche