TEMA 13

MANEJO DE CADENAS string.h



Creación del programa

Recordando la presentación de arreglos hecha (capítulo 5) en donde las cadenas están definidas como un arreglo de caracteres o un apuntador a una porción de memoria conteniendo caracteres ASCII. Una cadena en C es una secuencia de cero o más caracteres seguidas por un caracter NULL o MARCA_VALUE_PAGINA:




Es importante preservar el caracter de terminación NULL, ya que con éste es como C define y maneja las longitudes de las cadenas. Todas las funciones de la biblioteca estándar de C lo requieren para una operación satisfactoria.

En general, aparte de algunas funciones restringidas en longitud (strncat(), strncmp() y strncpy()), al menos que se creen cadenas a mano, no se deberán encontrar problemas. Se deberán usar las funciones para manejo de cadenas y no tratar de manipular las cadenas en forma manual desmantelando y ensamblando cadenas.

Funciones básicas para el manejo de cadenas

Todas las funciones para manejo de cadenas tienen su prototipo en:

#include

Las funciones más comunes son descritas a continuación:

• char *strcpy(const char *dest, const char *orig) -- Copia la cadena de caracteres apuntada por orig (incluyendo el carácter terminador 'MARCA_VALUE_PAGINA') al vector apuntado por dest. Las cadenas no deben solaparse, y la de destino, debe ser suficientemente grande como para alojar la copia.
• int strcmp(const char *s1, const char *s2) -- Compara las dos cadenas de caracteres s1 y s2. Devuelve un entero menor, igual o mayor que cero si se encuentra que s1 es, respectivamente, menor que, igual a, o mayor que s2.
• char *strerror(int errnum) -- Devuelve un mensaje de error que corresponde a un número de error.
• int strlen(const char *s) -- Calcula la longitud de la cadena de caracteres.
• char *strncat(char *s1, const char *s2, size_t n) -- Agrega n caracteres de s2 a s1.
• int strncmp(const char *s1, char *s2, size_t n) -- Compara los primeros n caracteres de dos cadenas.
• char *strncpy(const char *s1, const char *s2, size_t n) -- Copia los primeros n caracteres de s2 a s1.
• strcasecmp(const char *s1, const char *s2) -- versión que ignora si son mayúsculas o minúsculas de strcmp().
• strncasecmp(const char *s1, const char *s2, size_t n) -- versión insensible a mayúsculas o minúsculas de strncmp() que compara los primeros n caracteres de s1.

El uso de muchas funciones es directo, por ejemplo:

char *s1 = "Hola";
char *s2;
int longitud;

longitud = strlen("Hola"); /* long = 4 */
(void) strcpy(s2,s1);

Observar que tanto strcat() y strcopy() regresan una copia de su primer argumento, el cual es el arreglo destino. Observar también que orden de los argumentos es arreglo destino seguido por arreglo fuente lo cual a veces es una situación para hacerlo incorrectamente.

La función strcmp() compara lexicográficamente las dos cadenas y regresa:

• Menor que cero -- si s1 es léxicamente menor que s2;
• Cero -- si s1 y s2 son léxicamente iguales;
• Mayor que cero -- si s1 es léxicamente mayor que s2;

Las funciones de copiado strncat(), strncmp() y strncpy() son versiones más restringidas que sus contrapartes más generales. Realizan una tarea similar, pero solamente para los primeros n caracteres. Observar que el caracter de terminación NULL podría ser violado cuando se usa estas funciones, por ejemplo:

char *s1 = "Hola";
char *s2 = 2;
int longitud = 2;

(void) strncpy(s2, s1, longitud); /* s2 = "Ho" */
donde s2 no tiene el terminador NULL.

Búsqueda en cadenas

La biblioteca también proporciona varias funciones de búsqueda en cadenas.

• char *strchr(const char *s, int c) -- Devuelve un puntero a la primera ocurrencia del carácter c en la cadena de caracteres s.
• char *strrchr(const char *s, int c) -- Encuentra la última ocurrencia del caracter c en la cadena.
• char *strstr(const char *s1, const char *s2) -- Localiza la primera ocurrencia de la cadena s2 en la cadena s1.
• char *strpbrk(const char *s1, const char *s2) -- Regresa un apuntador a la primera ocurrencia en la cadena s1 de cualquier carácter de la cadena s2, o un apuntador nulo si no hay un caracter de s2 que exista en s1.
• size_t strspn(const char *s1, const char *s2) -- Calcula la longitud del segmento inicial de s1 que consta únicamente de caracteres en s2.
• size_t strcspn(const char *s1, const char *s2) -- Regresa el número de caracteres al principio de s1 que no coinciden con s2.
• char *strtok(char *s1, const char *s2) -- Divide la cadena apuntada a s1 en una secuencia de ``tokens'', cada uno de ellos esta delimitado por uno o más caracteres de la cadena apuntada por s2.

Las funciones strchr() y strrchr() son las más simples de usar, por ejemplo:
char *s1 = "Hola";
char *resp;

resp = strchr(s1,'l');

Después de la ejecución, resp apunta a la localidad s1 + 2.

La función strpbrk() es una función más general que busca la primera ocurrencia de cualquier grupo de caracteres, por ejemplo:

char *s1 = "Hola";
char *resp;

res = strpbrk(s1,"aeiou");

En este caso, resp apunta a la localidad s1 + 1, la localidad de la primera o.

La función strstr() regresa un apuntador a la cadena de búsqueda especificada o un apuntador nulo si la cadena no es encontrada. Si s2 apunta a una cadena de longitud cero (esto es, la cadena ""), la función regres s1. Por ejemplo:
char *s1 = "Hola";
char *resp;

resp = strstr(s1,"la");

la cual tendrá resp = s1 + 2.

La función strtok() es un poco más complicada en cuanto a operación. Si el primer argumento no es NULL entonces la función encuentra la posición de cualquiera de los caracteres del segundo argumento. Sin embargo, la posición es recordada y cualquir llamada subsecuente a strtok() iniciará en ésa posición si en estas subsecuentes llamadas el primer argumento no es NULL. Por ejemplo, si deseamos dividir la cadena s1 usando cada espacio e imprimir cada ``token'' en una nueva línea haríamos lo siguiente:
char s1[] = "Hola muchacho grande";
char *t1;

for ( t1 = strtok(s1," ");
t1 != NULL;
t1 = strtok(NULL, " ") )
printf("%s\n",t1);

Se emplea un ciclo for en una forma no regular de conteo:

• En la inicialización se llama a la función strtok() con la cadena s1.
• Se termina cuando t1 es NULL.
• Se esta asignando tokens de s1 a t1 hasta la terminación llamando a strtok() con el primer argumento NULL.

Prueba y conversión de caracteres ctype.h

Una biblioteca relacionada #include la cual contiene muchas funciones útiles para convertir y probar caracteres individuales.

Las funciones más comunes para revisar caracteres tienen los siguientes prototipos:

• int isalnum(int c) -- Verdad si c es alfanumérico.
• int isalpha(int c) -- Verdad si c es una letra.
• int isascii(int c) -- Verdad si c es ASCII.
• int iscntrl(int c) -- Verdad si c es un caracter de control.
• int isdigit(int c) -- Verdad si c es un dígito decimal.
• int isgraph(int c) -- Verdad si c es un caracter imprimible, exceptuando el espacio en blanco.
• int islower(int c) -- Verdad si c es una letra minúscula.
• int isprint(int c) -- Verdad si c es un caracter imprimible, incluyendo el espacio en blanco.
• int ispunct(int c) -- Verdad si c es un signo de puntuación.
• int isspace(int c) -- Verdad si c es un espacio
• int isupper(int c) -- Verdad si c es una letra mayúscula.
• int isxdigit(int c) -- Verdad si c es un dígito hexadecimal.

Las funciones para conversión de caracteres son:

• int toascii(int c) -- Convierte c a ASCII o un unsigned char de 7 bits, borrando los bits altos.
• int tolower(int c) -- Convierte la letra c a minúsculas, si es posible.
• int toupper(int c) -- Convierte la letra c a mayúsculas, si es posible.

El uso de estas funciones es directo y por lo tanto, no se dan ejemplos.

REGRESAR ARRIBA


REGRESAR A LA PAGINA INICIAL