Funciones de Manejo de Cadenas
Funciones de Manejo de Cadenas
Funciones de Manejo de Cadenas
Para usar estas funciones en nuestro programa hay que aadir la directiva:
#include <string.h> // o #include <cstring>
strlen
size_t *strlen(const char *cadena);
Esta funcin devuelve el nmero de caracteres que tiene la cadena (sin contar el fin de cadena '\0').
#include <stdio.h> // #include <string.h> // o #include <cstdio> int main() { char texto[]="Unefa"; int longitud; longitud = strlen(texto); printf( "La cadena \"%s\" tiene %d caracteres.\n", texto, longitud ); }
Como ejemplo, vamos a ver cmo se programara esta funcin si no dispusiramos de ella. Se hara con punteros.
#include <stdio.h> #include <string.h> int main() { char texto[]="Unefa"; char *p; int longitud=0; p = texto; while (*p != '\0') { longitud++; printf( "%c\n", *p );/* Mostramos la letra actual */ p++; /* Vamos a la siguiente letra */ }
Para medir la longitud de la cadena usamos un puntero para recorrerla (el puntero p). Hacemos que p apunte a texto. Luego entramos en un bucle while. La condicin del bucle comprueba si se ha llegado al fin de cadena ( '\0'). Si no es as, suma 1 a longitud, muestra la letra por pantalla e incrementa el puntero en 1 (con lo que pasamos a la siguiente letra). strcpy
char *strcpy(char *cadena1, const char *cadena2);
Copia el contenido de cadena2 en cadena1. cadena2 puede ser una variable o una cadena directa (por ejemplo, "hola"). Debemos tener cuidado de que la cadena destino (cadena1) tenga espacio suficiente para albergar a la cadena origen ( cadena2).
#include <stdio.h> #include <string.h> int main() { char texto[] = "este es un curso de C."; char destino[50]; strcpy( destino, texto ); printf( "Valor final: %s\n", destino ); }
Vamos a ver otro ejemplo en el que la cadena destino es una cadena constante ("ste es un curso de C.") y no una variable. Adems, en este ejemplo vemos que la cadena origen es sustituida por la cadena destino totalmente. Si la cadena origen es ms larga que la destino, se eliminan las letras adicionales.
#include <stdio.h> #include <string.h> int main() { char destino[50]="ste no es un curso de PHP, sino de C."; printf( "%s\n", destino ); strcpy( destino, "ste es un curso de C." ); printf( "%s\n", destino ); }
strcat
char *strcat(char *cadena1, const char *cadena2);
#include <stdio.h> #include <string.h> int main() { char nombre_completo[50]; char nombre[]="Pedro"; char apellido[]="Perez"; strcpy( strcat( strcat( printf( } nombre_completo, nombre ); nombre_completo, " " ); nombre_completo, apellido ); "El nombre completo es: %s.\n", nombre_completo );
Como siempre, tenemos que asegurar que la variable en la que aadimos las dems cadenas tenga el tamao suficiente. Con la primera lnea de este programa introducimos el nombre en nombre_completo. Usamos strcpy para asegurarnos de que queda borrado cualquier dato anterior. Luego usamos un strcat para aadir un espacio y, finalmente, introducimos el apellido. strcmp
int strcmp(const char *cadena1, const char *cadena2);
Compara cadena1 y cadena2. Si son iguales, devuelve 0. Un nmero negativo si cadena1 "va" antes que cadena2, y un nmero positivo si es al contrario:
< 0 si cadena1 < cadena2 ==0 si cadena1 == cadena2 > 0 si cadena1 > cadena2
#include <stdio.h> #include <string.h> int main() { char nombre1[]="Unefa "; char nombre2[]="Virtual"; printf( "Comparacin con strcmp: %d \n", strcmp(nombre1,nombre2)); }
El resultado es:
Comparacin con strcmp : - 1
Las cadenas se pueden recorrer de igual forma que se hace con los arrays, usando punteros. Vamos a ver un ejemplo: el siguiente programa cuenta los espacios y las letras e (minsculas) que hay en una cadena.
#include <stdio.h> #include <string.h>
int main() { char cadena[]="Nuestro encuentro es el jueves"; char *p; int espacios = 0, letras_e = 0; p = cadena; while (*p != '\0') { if (*p == ' ') espacios++; if (*p == 'e') letras_e++; p++; } printf( "En la cadena \"%s\" hay:\n", cadena ); printf( " %i espacios\n", espacios ); printf( " %i letras e\n", letras_e ); }
El resultado es:
En la cadena "Nuestro encuentro es el jueves hay: 4 espacios 7 letras e
Para recorrer la cadena necesitamos un puntero p que sea de tipo char. Debemos hacer que p apunte a la cadena (p=cadena). As, p apunta a la direccin del primer elemento de la misma. El valor de *p sera, por tanto, 'N'. Comenzamos el bucle. La condicin comprueba que no se ha llegado al final de la cadena ( *p != '\0'). Entonces se comprueba si en la direccin a la que apunta p hay un espacio o una letra e. Si es as, se incrementan las variables correspondientes. Una vez comprobado esto se pasa a la siguiente letra (p++). En este otro ejemplo substituimos los espacios por guiones:
#include <stdio.h> #include <string.h> int main() { char cadena[]="Feliz navidad jo jo jo"; char *p; p = cadena; while (*p != '\0') { if (*p == ' ') *p = '-'; p++; } printf( "La cadena queda: \"%s\" \n", cadena ); }
y se obtiene:
La cadena queda: "Feliz-navidad-jo-jo-jo"