Mi librería personal en C, evolucionando con cada proyecto.
Una colección de funciones útiles que han sido mi compañera fiel durante todo el cursus de 42.
My_library (también conocida como libft mejorada) es mi librería personal de C que nació con el proyecto Libft en el MILESTONE_0 de 42 Málaga, pero que ha crecido y evolucionado con cada nuevo proyecto del cursus.
Esta librería es mi caja de herramientas personal:
- Recodificaciones de funciones estándar de C (libc)
- Funciones adicionales que he necesitado en proyectos posteriores
- Utilidades para strings, memoria, listas enlazadas, y más
- Funciones personalizadas creadas por necesidad real
Filosofía: En 42 no podemos usar funciones de las librerías estándar de C en nuestros proyectos. Cada función que necesitas, debes crearla tú mismo. Esta librería es el resultado de ese aprendizaje progresivo.
Estado actual: 🔄 En constante evolución. Cada nuevo proyecto del cursus puede traer nuevas funciones.
| Categoría | Herramienta / Tecnología |
|---|---|
| Lenguaje | C (C99) |
| Compilador | GCC / CC / Clang |
| Estilo | Norminette (estándar de 42) |
| Depuración | Valgrind / GDB |
| Build System | Makefile |
| Control de versiones | Git + GitHub |
| Normas | -Wall -Wextra -Werror |
📦 My_library
├── GNL/ # Get Next Line
│ └── get_next_line.c # Función para leer línea por línea
├── ft_lib/ # Funciones básicas de libft
│ ├── ft_is*.c # Verificación (isalpha, isdigit...)
│ ├── ft_str*.c # Manipulación de strings
│ ├── ft_mem*.c # Manipulación de memoria
│ ├── ft_put*.c # Funciones de salida
│ └── ft_*.c # Conversiones y utilidades
├── ft_list/ # Listas enlazadas
│ └── ft_lst*.c # Funciones de listas (lstnew, lstadd...)
├── ft_printf/ # Printf personalizado
│ ├── ft_printf.c # Implementación principal
│ └── ft_printf_*.c # Funciones auxiliares de printf
├── ft_utils/ # Utilidades extra
│ ├── ft_replacechar.c # Reemplazar caracteres
│ └── *.c # Otras funciones útiles
├── includes/
│ └── libft.h # Cabeceras y prototipos de todas las funciones
├── obj/ # Archivos objeto (generados por make)
├── .gitignore # Archivos ignorados por git
├── Makefile # Compilación automatizada
├── libft.a # Librería compilada (generada)
└── README.md # Esta documentaciónOrganización modular: La librería está dividida por funcionalidad en carpetas separadas, facilitando el mantenimiento y la expansión de funciones según las necesidades de cada proyecto del cursus.
git clone https://github.com/lperalta14/My_library.git
cd My_library# Compilar la librería
make
# Esto genera libft.a1. Incluir el header en tu código:
#include "libft.h"
int main(void)
{
char *str;
str = ft_strdup("Hello 42!");
ft_putendl_fd(str, 1);
free(str);
return (0);
}2. Compilar tu proyecto con la librería:
# Forma manual
cc -Wall -Wextra -Werror main.c -L. -lft -I./includes -o mi_programa
# O mejor, crea un Makefile que enlace libft.a3. Ejemplo de Makefile para tu proyecto:
NAME = mi_programa
LIBFT = libft.a
LIBFT_DIR = my_library
SRCS = main.c utils.c
OBJS = $(SRCS:.c=.o)
CC = cc
CFLAGS = -Wall -Wextra -Werror -I$(LIBFT_DIR)/includes
all: $(LIBFT) $(NAME)
$(LIBFT):
make -C $(LIBFT_DIR)
$(NAME): $(OBJS)
$(CC) $(CFLAGS) $(OBJS) $(LIBFT_DIR)/$(LIBFT) -o $(NAME)
clean:
make clean -C $(LIBFT_DIR)
rm -f $(OBJS)
fclean: clean
make fclean -C $(LIBFT_DIR)
rm -f $(NAME)
re: fclean all
.PHONY: all clean fclean reLa librería está organizada en módulos según funcionalidad:
| Función | Descripción |
|---|---|
ft_isalpha |
Verifica si es letra (a-z, A-Z) |
ft_isdigit |
Verifica si es dígito (0-9) |
ft_isalnum |
Verifica si es alfanumérico |
ft_isascii |
Verifica si es carácter ASCII (0-127) |
ft_isprint |
Verifica si es carácter imprimible |
ft_toupper |
Convierte a mayúscula |
ft_tolower |
Convierte a minúscula |
| Función | Descripción |
|---|---|
ft_strlen |
Calcula longitud de string |
ft_strlcpy |
Copia string (segura) |
ft_strlcat |
Concatena strings (segura) |
ft_strchr |
Busca carácter en string |
ft_strrchr |
Busca carácter desde el final |
ft_strncmp |
Compara n caracteres de strings |
ft_strnstr |
Busca substring en n caracteres |
ft_strdup |
Duplica string (malloc) |
ft_substr |
Extrae substring |
ft_strjoin |
Une dos strings |
ft_strtrim |
Elimina caracteres del inicio y final |
ft_split |
Divide string por delimitador |
ft_strmapi |
Aplica función a cada char (con índice) |
ft_striteri |
Itera sobre string aplicando función |
| Función | Descripción |
|---|---|
ft_memset |
Rellena memoria con byte específico |
ft_bzero |
Rellena memoria con ceros |
ft_memcpy |
Copia memoria |
ft_memmove |
Copia memoria (segura con overlap) |
ft_memchr |
Busca byte en memoria |
ft_memcmp |
Compara bloques de memoria |
ft_calloc |
Reserva e inicializa memoria a cero |
| Función | Descripción |
|---|---|
ft_atoi |
Convierte string a entero |
ft_itoa |
Convierte entero a string |
| Función | Descripción |
|---|---|
ft_putchar_fd |
Escribe carácter en fd |
ft_putstr_fd |
Escribe string en fd |
ft_putendl_fd |
Escribe string + newline en fd |
ft_putnbr_fd |
Escribe número en fd |
typedef struct s_list
{
void *content;
struct s_list *next;
} t_list;| Función | Descripción |
|---|---|
ft_lstnew |
Crea nuevo nodo |
ft_lstadd_front |
Añade nodo al inicio |
ft_lstadd_back |
Añade nodo al final |
ft_lstsize |
Cuenta nodos de la lista |
ft_lstlast |
Retorna último nodo |
ft_lstdelone |
Elimina un nodo |
ft_lstclear |
Elimina toda la lista |
ft_lstiter |
Itera aplicando función |
ft_lstmap |
Crea nueva lista aplicando función |
| Función | Descripción |
|---|---|
get_next_line |
Lee una línea de un file descriptor |
Uso:
int fd = open("archivo.txt", O_RDONLY);
char *line;
while ((line = get_next_line(fd)) != NULL)
{
printf("%s", line);
free(line);
}
close(fd);Características:
- ✅ Lee de múltiples file descriptors simultáneamente
- ✅ Configurable con BUFFER_SIZE
- ✅ Gestión eficiente de memoria
- ✅ Funciona con stdin, archivos y pipes
| Función | Descripción |
|---|---|
ft_printf |
Implementación de printf con conversiones básicas |
Conversiones soportadas:
%c- Carácter%s- String%p- Puntero (hexadecimal)%d/%i- Entero decimal%u- Unsigned decimal%x- Hexadecimal minúsculas%X- Hexadecimal mayúsculas%%- Símbolo de porcentaje
Uso:
ft_printf("Hola %s, tienes %d años\n", "Luis", 25);
ft_printf("Puntero: %p\n", ptr);
ft_printf("Hexadecimal: %x\n", 255);Funciones personalizadas creadas para proyectos específicos:
| Función | Descripción | Usado en |
|---|---|---|
ft_replacechar |
Reemplaza caracteres en un string | so_long |
| (Otras funciones según necesidad) | ... | ... |
ft_replacechar:
char *ft_replacechar(char *str, char find, char replace);Reemplaza todas las ocurrencias de find por replace en str.
# Compilar
make
# Probar con tu propio main
gcc -Wall -Wextra -Werror test.c libft.a -I./includes -o test
./testPuedes usar testers de la comunidad de 42:
# Libft Unit Test
git clone https://github.com/alelievr/libft-unit-test.git
cd libft-unit-test
make f
# Libft Tester
git clone https://github.com/Tripouille/libftTester.git
cd libftTester
makevalgrind --leak-check=full --show-leak-kinds=all ./tu_programanorminette src/ includes/- Punteros y gestión de memoria dinámica
- Manipulación de strings y arrays
- Estructuras de datos (listas enlazadas)
- Gestión de file descriptors
- Makefiles y compilación modular
- Prevención de memory leaks
- Normas de código estrictas (Norminette)
- Recodificación de funciones estándar de C
✅ Funciones básicas de libc (string, memory, ctype)
✅ Funciones adicionales de strings
✅ Conversiones (atoi, itoa)
✅ Estructura de listas enlazadas
✅ Funciones completas de manipulación de listas
✅ Función get_next_line con lectura eficiente
✅ Soporte para múltiples file descriptors
✅ Gestión de buffer configurable
✅ Implementación completa de ft_printf
✅ Conversiones: c, s, p, d, i, u, x, X, %
✅ Funciones auxiliares de conversión
✅ ft_replacechar (para so_long)
✅ Otras funciones auxiliares según necesidad
La librería continúa creciendo con cada nuevo proyecto del cursus. Cada vez que necesito una función nueva, la añado aquí para reutilizarla en proyectos futuros.
Próximas adiciones posibles:
- Funciones matemáticas avanzadas
- Sistema de logging
- Utilidades de archivos
- ¿Tu sugerencia?
En 42, no puedes usar las funciones estándar de C (como strlen, strcpy, etc.) en tus proyectos. Debes recodificarlas tú mismo. Esto tiene varios beneficios:
- Entiendes cómo funcionan las funciones por dentro
- Aprendes a gestionar memoria correctamente
- Desarrollas debugging skills al encontrar bugs en tu propio código
- Creas código reutilizable para futuros proyectos
- Mejoras tu comprensión de C a nivel bajo
Cada función en esta librería tiene una historia: un bug que costó horas arreglar, una optimización que mejoró el rendimiento, un caso edge que no había considerado.
make # Compila la librería (genera libft.a)
make clean # Elimina archivos objeto (.o)
make fclean # Elimina archivos objeto y libft.a
make re # Recompila desde cero (fclean + all)
make bonus # Compila incluyendo funciones bonusEsta librería se descarga y compila automáticamente en mis otros proyectos mediante Makefiles:
LIBFT_DIR = mylib
LIBFT_REPO = https://github.com/lperalta14/My_library.git
LIBFT_LIB = $(LIBFT_DIR)/libft.a
$(LIBFT_LIB):
@if [ ! -d "$(LIBFT_DIR)" ]; then \
git clone $(LIBFT_REPO) $(LIBFT_DIR); \
fi
@make -C $(LIBFT_DIR)Esta librería respeta todas las normas de 42:
✅ Norminette aprobada
✅ Compilación con -Wall -Wextra -Werror
✅ Sin variables globales
✅ Sin memory leaks
✅ Solo funciones permitidas: write, malloc, free
✅ Nombres de función con prefijo ft_
✅ Makefile debe recompilar solo archivos modificados
Checklist para añadir una nueva función:
- Crear archivo
ft_nueva_funcion.censrc/ - Añadir prototipo a
includes/libft.h - Añadir el
.calSRCSdel Makefile - Verificar con Norminette
- Testear exhaustivamente
- Verificar memory leaks con Valgrind
- Documentar en este README
- Commit con mensaje descriptivo
Luis Peralta (lperalta14)
📍 42 Málaga
💼 LinkedIn
💻 GitHub
📧 luisperaltamunoz@gmail.com
Este proyecto es parte del cursus de 42 School y está sujeto a las normas de la escuela.
El código es de uso libre para estudiantes de 42.
⭐ Si usas esta librería en tus proyectos, considera darle una estrella al repo!
💡 "Una librería no es solo código, es la historia de tu aprendizaje."
🔧 Cada función aquí ha sido debuggeada con sudor, lágrimas y café.