Funciones de Conversión de Caracteres
Uso e Implementación de strlen
Uso e Implementación de strcpy
Uso e Implementación de strcat
Uso e Implementación de strcmp
Uso de strncpy
Uso de strncat
Uso de strncmp
Uso e Implementación de strstr
Uso de strtok
Uso de strerror
- Funciones de Clasificación de Caracteres
El lenguaje C proporciona un conjunto de funciones diseñadas específicamente para clasificar caracteres. Estas funciones requieren incluir la biblioteca <ctype.h>.
Ejercicio: Convertir todas las letras minúsculas de una cadena a mayúsculas.
#include <stdio.h>
#include <ctype.h>
int main(void)
{
char mensaje[] = "Hello,World";
int posicion = 0;
while (mensaje[posicion] != '\0')
{
if (islower(mensaje[posicion]))
{
mensaje[posicion] -= 32;
}
posicion++;
}
printf("%s\n", mensaje);
return 0;
}
- Funciones de Conversión de Caracteres
C ofrece dos funciones de conversión entre mayúsculas y minúsculas:
int tolower(int c);— Convierte un carácter mayúsculo a minúsculo.int toupper(int c);— Convierte un carácter minúsculo a mayúsculo.
Aplicando estas funciones al problema anterior:
#include <stdio.h>
#include <ctype.h>
int main(void)
{
char texto[] = "Hello,World";
int idx = 0;
while (texto[idx] != '\0')
{
if (islower(texto[idx]))
{
texto[idx] = toupper(texto[idx]);
}
idx++;
}
printf("%s\n", texto);
return 0;
}
- Uso e Implementación Propia de strlen
Las cadenas en C utilizan el carácter '\0' como delimitador de finalización. La función strlen retorna la cantidad de caracteres previos al '\0' (sin incluirlo).
- La cadena pasada como argumento debe terminar en
'\0'. - El tipo de retorno es
size_t, un tipo sin signo (fuente común de errores). - Se requiere incluir
<string.h>.
#include <stdio.h>
#include <string.h>
int main(void)
{
const char *cadenaA = "abcdef";
const char *cadenaB = "bbb";
if (strlen(cadenaB) - strlen(cadenaA) > 0)
printf("cadenaB es mayor que cadenaA\n");
else
printf("cadenaA es mayor que cadenaB\n");
return 0;
}
El resultado muestra "cadenaB es mayor que cadenaA" porque strlen retorna un valor sin signo, provocando que la resta produzca un número positivo grande cuando el resultado lógico sería negativo.
Implementación con contador
int mi_strlen(const char *str)
{
int contador = 0;
assert(str != NULL);
while (*str != '\0')
{
contador++;
str++;
}
return contador;
}
Implementación recursiva
int mi_strlen(const char *str)
{
assert(str != NULL);
if (*str == '\0')
return 0;
return 1 + mi_strlen(str + 1);
}
Implementación con aritmética de punteros
int mi_strlen(const char *str)
{
assert(str != NULL);
const char *fin = str;
while (*fin != '\0')
fin++;
return fin - str;
}
- Uso e Implementación Propia de strcpy
char *strcpy(char *destino, const char *origen);
- La cadena origen debe finalizar con
'\0'. - El
'\0'también se copia al destino. - El buffer destino debe tener suficiente espacio.
- El buffer destino debe ser modificable.
char *mi_strcpy(char *dst, const char *src)
{
char *inicio = dst;
assert(dst != NULL);
assert(src != NULL);
while ((*dst++ = *src++) != '\0')
{
/* La copia se realiza dentro de la condición */
}
return inicio;
}
- Implementación Propia de strcat
char *mi_strcat(char *dst, const char *src)
{
char *resultado = dst;
assert(dst != NULL);
assert(src != NULL);
while (*dst != '\0')
dst++;
while ((*dst++ = *src++) != '\0')
{
/* Concatenación en la condición */
}
return resultado;
}
- Implementación Propia de strcmp
Retorna un valor positivo si la primera cadena es mayor, cero si son iguales, y un valor negativo si es menor.
int mi_strcmp(const char *izq, const char *der)
{
assert(izq != NULL);
assert(der != NULL);
while (*izq == *der)
{
if (*izq == '\0')
return 0;
izq++;
der++;
}
return *izq - *der;
}
- Uso de strncpy
Copia como máximo num caracteres de la cadena origen al destino. Si la cadena origen tiene menos de num caracteres, el espacio restante se rellena con bytes '\0'.
- Uso de strncat
char *strncat(char *destino, const char *origen, size_t num);
- Uso de strncmp
int strncmp(const char *str1, const char *str2, size_t num);
Compara como máximo los primeros num caracteres de ambas cadenas. Si encuentra una diferencia antes de llegar al límite, retorna inmediatamente. Si los num caracteres coinciden, retorna 0.
- Uso e Implementación Propia de strstr
#include <stdio.h>
#include <string.h>
int main(void)
{
char frase[] = "This is a simple string";
char *encontrado = strstr(frase, "simple");
strncpy(encontrado, "sample", 6);
printf("%s\n", frase);
return 0;
}
char *mi_strstr(const char *texto, const char *patron)
{
const char *posicion = texto;
if (*patron == '\0')
return (char *)texto;
while (*posicion != '\0')
{
const char *t = posicion;
const char *p = patron;
while (*t != '\0' && *p != '\0' && *t == *p)
{
t++;
p++;
}
if (*p == '\0')
return (char *)posicion;
posicion++;
}
return NULL;
}
- Uso de strtok
char *strtok(char *str, const char *delimitadores);
- El parámetro
delimitadoresdefine los caracteres separadores. - La función localiza el siguiente token y lo termina con
'\0'. - La primera llamada con un puntero no nulo establece la posición inicial; las llamadas posteriores con
NULLcontinúa desde la última posición. - Retorna
NULLcuando no hay más tokens.
#include <stdio.h>
#include <string.h>
int main(void)
{
char direccion[] = "192.168.6.111";
const char *separador = ".";
char *token;
for (token = strtok(direccion, separador);
token != NULL;
token = strtok(NULL, separador))
{
printf("%s\n", token);
}
return 0;
}
- Uso de strerror
La función strerror recibe un código de error entero y retorna la dirección de la cadena que describe ese error. Los códigos de error están definidos en <errno.h>. Al iniciar un programa en C, la variable global errno se establece en 0 (sin error). Cuando una función de la biblioteca estándar encuentra un problema, almacena el código de error correspondiente en errno, y strerror permite obtener una descripción legible de dicho código.