Skip to article frontmatterSkip to article content

Ejercicios de Cadenas

Acerca de

La manipulación de cadenas es una de las tareas más comunes y, en C, una de las más propensas a errores. Estos ejercicios están diseñados para construir una base sólida en el manejo de cadenas de caracteres (estilo C, terminadas en nulo), enfocándose en la implementación de algoritmos comunes desde cero. Es crucial que al resolverlos, se apliquen los principios de manejo de “cadenas seguras” (Regla 0x0030h: Todas las operaciones con cadenas deben ser seguras), pasando siempre la capacidad del búfer para evitar desbordamientos.


1: Análisis de Cadenas

1.1: Contar vocales

Descripción

Escribir una función que cuente el número total de vocales (a, e, i, o, u) en una cadena de texto. La función no debe distinguir entre mayúsculas y minúsculas.

1.2: Contabilizador de caracteres

Descripción

Implementar una función que calcule la frecuencia de aparición de cada carácter dentro de una cadena y muestre el resultado para aquellos caracteres que aparecen al menos una vez.

1.3: ¿Es un número válido?

Descripción

Desarrollar una función que verifique si una cadena de texto representa un número de punto flotante válido. La validación debe seguir un conjunto de reglas específicas.

1.4: ¿Es alfabética?

Descripción

Crear una función que determine si una cadena contiene únicamente caracteres alfabéticos (de la ‘a’ a la ‘z’, mayúsculas o minúsculas).


2: Propiedades de Cadenas

2.1: Palíndromo

Descripción

Implementar una función que verifique si una cadena es un palíndromo, es decir, si se lee igual de izquierda a derecha que de derecha a izquierda. La verificación debe ignorar espacios en blanco y no debe ser sensible a mayúsculas/minúsculas.

2.2: Anagrama

Descripción

Escribir una función que determine si una cadena es un anagrama de otra (es decir, si ambas tienen los mismos caracteres con la misma frecuencia), ignorando mayúsculas/minúsculas y espacios.

2.3: Pangrama

Descripción

Verificar si una cadena es un pangrama, es decir, si contiene todas las letras del alfabeto inglés al menos una vez. La verificación debe ser insensible a mayúsculas/minúsculas.


3: Manipulación y Transformación

3.1: Tokenización

Descripción

Dividir una cadena en una secuencia de “tokens” (subcadenas) basándose en un carácter delimitador. La función strtok de C es un ejemplo clásico de esto.

3.2: Compresión RLE (Run-Length Encoding)

Descripción

Implementar una forma simple de compresión de cadenas llamada Run-Length Encoding. Esta técnica compacta una cadena reemplazando secuencias de caracteres idénticos por el número de repeticiones seguido del carácter.

3.3: Desduplicador

Descripción

Escribir una función que elimine los caracteres duplicados de una cadena, conservando únicamente la primera aparición de cada carácter. La modificación puede ser in-place.

3.4: Número a cadena con formato

Descripción

Transformar un número entero largo en una cadena de texto, insertando separadores de miles (puntos o comas) para mejorar la legibilidad.

3.5: Búsqueda de Subcadena

Descripción

Implementar una función que busque la primera ocurrencia de una subcadena (needle o aguja) dentro de una cadena principal (haystack o pajar). Es una reimplementación de la función strstr.


4: Conversión de Base Numérica

4.1: Binario a Decimal

Descripción

Convertir una cadena que representa un número en formato binario (compuesta de '0’s y '1’s) a su valor entero decimal correspondiente.

4.2: Hexadecimal a Decimal

Descripción

Convertir una cadena que representa un número en formato hexadecimal (dígitos 0-9 y letras A-F, insensibles a mayúsculas) a su valor entero decimal.

4.3: Decimal a Binario

Descripción

Convertir un número entero decimal a su representación en una cadena de texto binaria.

4.4: Decimal a Hexadecimal

Descripción

Convertir un número entero decimal a su representación en una cadena de texto hexadecimal.


5: Más Ejercicios de Cadenas

5.1: Invertir Palabras en una Frase

Descripción

Escribir una función que tome una frase y la modifique de tal manera que cada palabra individual quede invertida, pero el orden de las palabras en la frase se mantenga intacto.

5.2: Invertir Orden de las Palabras

Descripción

Escribir una función que invierta el orden de las palabras en una frase. Por ejemplo, “Hola Mundo desde C” se convertiría en “C desde Mundo Hola”.

5.3: Capitalización (Title Case)

Descripción

Implementar una función que convierta una cadena a “Title Case”, donde la primera letra de cada palabra está en mayúscula y el resto de las letras de la palabra están en minúscula.

5.4: Contar Palabras

Descripción

Desarrollar una función que cuente el número de palabras en una cadena. Se puede considerar que las palabras están separadas por uno o más espacios.

5.5: Eliminar Espacios Extra

Descripción

Crear una función que elimine los espacios en blanco redundantes de una cadena: espacios al principio, al final y múltiples espacios entre palabras, dejando solo un espacio entre cada palabra.

5.6: Recorte de Cadena (Trim)

Descripción

Implementar una función trim que modifique una cadena para eliminar todos los espacios en blanco (o cualquier otro carácter de espaciado como tabuladores o saltos de línea) que se encuentren al principio y al final de la misma.

5.7: Reemplazar Subcadena

Descripción

Escribir una función que reemplace todas las ocurrencias de una subcadena por otra dentro de una cadena principal. La función debe manejar cambios en la longitud de la cadena, lo que usualmente requiere memoria dinámica.

5.8: Validación de Email (Simple)

Descripción

Crear una función que verifique si una cadena tiene un formato de correo electrónico básico. No busca ser exhaustiva (lo cual es muy complejo), sino validar una estructura mínima.

5.9: Cifrado César

Descripción

Implementar el Cifrado César, un tipo de cifrado por sustitución en el que cada letra en el texto original es reemplazada por una letra un número fijo de posiciones más adelante en el alfabeto, de forma circular.

5.10: Descifrado César

Descripción

Escribir la función complementaria que descifre un mensaje cifrado con el Cifrado César, conociendo el desplazamiento. Es la operación inversa al ejercicio anterior.

5.11: Encontrar el Carácter Más Frecuente

Descripción

Desarrollar una función que encuentre y devuelva el carácter que aparece con más frecuencia en una cadena. Si hay empates, puede devolver cualquiera de los más frecuentes.

5.12: Comparación de Cadenas (Ignorando Mayúsculas)

Descripción

Implementar su propia versión de la función strcasecmp, que compara dos cadenas sin diferenciar entre mayúsculas y minúsculas.

5.13: Extraer Subcadena

Descripción

Crear una función que extraiga una porción de una cadena. La función debe recibir la cadena original, una posición de inicio y una longitud, y devolver una nueva cadena con la subcadena extraída.

5.14: Justificar Texto (Simple)

Descripción

Implementar una función que justifique una línea de texto a un ancho específico, insertando espacios adicionales entre las palabras de la manera más uniforme posible.

5.15: Acrónimo

Descripción

Escribir una función que genere un acrónimo a partir de una frase, tomando la primera letra de cada palabra.


6: Cadenas y Algoritmos

6.1: Distancia de Hamming

Descripción

Implementar una función que calcule la distancia de Hamming entre dos cadenas de igual longitud. Esta distancia es el número de posiciones en las que los caracteres correspondientes son diferentes.

6.2: Subsecuencia Común Más Larga (LCS)

Descripción

Escribir una función que encuentre la longitud de la subsecuencia común más larga (LCS) entre dos cadenas. Una subsecuencia no tiene por qué ser contigua.

6.3: Validación de IP Simple

Descripción

Crear una función que verifique si una cadena representa una dirección IPv4 válida. Debe consistir en cuatro números entre 0 y 255, separados por puntos.

6.4: Convertir a snake_case

Descripción

Implementar una función que convierta una cadena en camelCase o PascalCase a snake_case. Esto implica insertar un guion bajo antes de cada letra mayúscula y convertir toda la cadena a minúsculas.

6.5: Convertir a camelCase

Descripción

Implementar una función que convierta una cadena en snake_case a camelCase. Esto implica eliminar los guiones bajos y poner en mayúscula la letra que les seguía.

6.6: Rotación de Cadena

Descripción

Escribir una función que determine si una cadena s2 es una rotación de otra cadena s1.

6.7: Eliminar Comentarios

Descripción

Crear una función que reciba una cadena (que puede representar una o más líneas de código) y elimine los comentarios de estilo C (//... hasta el final de la línea y /*...*/ incluyendo el contenido).

6.8: Análisis de URL Simple

Descripción

Dada una URL en formato de cadena, escribir una función que la analice y extraiga sus componentes principales: protocolo, host y ruta.

6.9: Generador de “Slugs”

Descripción

Un “slug” es una versión de una cadena amigable para URLs. Escribir una función que convierta un título en un slug: debe estar en minúsculas, los espacios deben ser reemplazados por guiones y se deben eliminar todos los caracteres no alfanuméricos.

6.10: Primer Carácter No Repetido

Descripción

Implementar una función que encuentre y devuelva el primer carácter en una cadena que no se repite en el resto de la cadena.