Partie Obligatoire - Gregory-Marquiset/gm_libft GitHub Wiki

Fonctions Obligatoires de la Libft

Cette section couvre les fonctions obligatoires de la bibliothèque Libft. Chaque fonction est décrite en détail pour fournir une compréhension claire de son utilité, de sa logique, et de son contexte d'utilisation.


🔗 Gestion des chaînes

ft_strlen

  • Prototype :
size_t ft_strlen(const char *s);
  • But de la fonction : La fonction ft_strlen calcule la longueur de la chaîne de caractères pointée par s, en excluant le caractère nul terminal (\0).

  • Contexte d'utilisation : Utile pour déterminer la taille d'une chaîne de caractères, par exemple lors de l'allocation dynamique de mémoire ou de la manipulation de chaînes.

  • Logique du code :

  1. La fonction initialise un compteur à zéro, puis parcourt chaque caractère de la chaîne jusqu'au caractère nul terminal, en incrémentant le compteur à chaque itération.
  2. Elle retourne ensuite la valeur du compteur, représentant la longueur de la chaîne.

ft_strdup

  • Prototype :
char *ft_strdup(const char *s1);
  • But de la fonction : La fonction ft_strdup alloue suffisamment de mémoire pour créer une copie de la chaîne s1, effectue la copie, et retourne un pointeur vers cette nouvelle chaîne.

  • Contexte d'utilisation : Utile lorsqu'une duplication de chaîne est nécessaire, notamment pour éviter des modifications involontaires de la chaîne originale.

  • Logique du code :

  1. La fonction commence par déterminer la longueur de s1 en utilisant ft_strlen.
  2. Ensuite, elle alloue de la mémoire pour la nouvelle chaîne, incluant l'espace pour le caractère nul terminal.
  3. Si l'allocation réussit, elle copie chaque caractère de s1 dans la nouvelle chaîne et ajoute le caractère nul terminal à la fin.
  4. Enfin, elle retourne le pointeur vers la nouvelle chaîne.

ft_strjoin

  • Prototype :
char *ft_strjoin(const char *s1, const char *s2);
  • But de la fonction : La fonction ft_strjoin alloue et retourne une nouvelle chaîne, résultat de la concaténation de s1 et s2.

  • Contexte d'utilisation : Utile pour combiner deux chaînes en une seule, par exemple lors de la construction de chemins de fichiers ou de messages.

  • Logique du code :

  1. La fonction calcule d'abord la longueur totale nécessaire en additionnant les longueurs de s1 et s2, plus un octet pour le caractère nul terminal.
  2. Elle alloue ensuite la mémoire correspondante.
  3. Si l'allocation réussit, elle copie s1 dans la nouvelle chaîne, puis ajoute s2 à la suite.
  4. Enfin, elle ajoute le caractère nul terminal et retourne le pointeur vers la nouvelle chaîne.

ft_substr

  • Prototype :
char *ft_substr(const char *s, unsigned int start, size_t len);
  • But de la fonction : La fonction ft_substr alloue et retourne une sous-chaîne de la chaîne s, commençant à l'index start et de longueur maximale len.

  • Contexte d'utilisation : Utile pour extraire une portion spécifique d'une chaîne, comme lors du traitement de sous-chaînes ou de l'analyse de texte.

  • Logique du code :

  1. La fonction vérifie d'abord si s est non nul.
  2. Ensuite, elle détermine la longueur de s et ajuste start et len si nécessaire pour éviter des dépassements.
  3. Elle alloue ensuite la mémoire pour la sous-chaîne, copie les caractères appropriés de s à partir de start jusqu'à start + len, ajoute le caractère nul terminal, et retourne le pointeur vers la nouvelle sous-chaîne.

ft_strtrim

  • Prototype :
char *ft_strtrim(const char *s1, const char *set);
  • But de la fonction : La fonction ft_strtrim alloue et retourne une copie de s1 avec les caractères spécifiés dans set supprimés du début et de la fin de la chaîne.

  • Contexte d'utilisation : Utile pour nettoyer des chaînes en supprimant des caractères indésirables, tels que des espaces ou des symboles spécifiques, en tête et en queue de chaîne.

  • Logique du code :

  1. La fonction détermine d'abord les positions de début et de fin où les caractères ne font pas partie de set.
  2. Ensuite, elle alloue de la mémoire pour la nouvelle chaîne correspondant à cette section.
  3. Elle copie les caractères de s1 entre ces positions dans la nouvelle chaîne, ajoute le caractère nul terminal, et retourne le pointeur vers la chaîne résultante.

ft_strchr

  • Prototype :
char *ft_strchr(const char *s, int c);
  • But de la fonction : La fonction ft_strchr localise la première occurrence du caractère c dans la chaîne pointée par s.

  • Contexte d'utilisation : Utile pour rechercher un caractère spécifique dans une chaîne, par exemple pour analyser ou diviser des chaînes en fonction de délimiteurs.

  • Logique du code :

  1. La fonction parcourt la chaîne s caractère par caractère.
  2. Lorsqu'elle trouve le caractère c, elle retourne un pointeur vers cette position dans la chaîne.
  3. Si c est le caractère nul (\0), la fonction retourne un pointeur vers la fin de la chaîne.
  4. Si c n'est pas trouvé, elle retourne NULL.

ft_strrchr

  • Prototype :
char *ft_strrchr(const char *s, int c);
  • But de la fonction : La fonction ft_strrchr recherche la dernière occurrence du caractère c dans la chaîne de caractères s. Si le caractère est trouvé, elle renvoie un pointeur vers cette position dans la chaîne ; sinon, elle renvoie NULL.

  • Contexte d'utilisation : ft_strrchr est utile lorsque vous devez localiser la dernière occurrence d'un caractère spécifique dans une chaîne, par exemple pour extraire l'extension d'un nom de fichier en recherchant le dernier point (.).

  • Logique du code :

  1. Parcourir la chaîne s jusqu'à la fin pour déterminer sa longueur.
  2. Revenir en arrière depuis la fin de la chaîne, en comparant chaque caractère à c.
  3. Si une correspondance est trouvée, retourner un pointeur vers cette position.
  4. Si le début de la chaîne est atteint sans trouver c, retourner NULL.

ft_strncmp

  • Prototype :
int ft_strncmp(const char *s1, const char *s2, size_t n);
  • But de la fonction : ft_strncmp compare lexicographiquement jusqu'à n caractères des chaînes s1 et s2. Elle renvoie un entier indiquant la relation entre les deux chaînes :

  • Un résultat négatif si s1 est inférieure à s2.

  • Zéro si s1 est égale à s2.

  • Un résultat positif si s1 est supérieure à s2.

  • Contexte d'utilisation : Cette fonction est utile pour comparer des chaînes jusqu'à un certain nombre de caractères, par exemple pour vérifier des préfixes ou lors de tris lexicographiques limités.

  • Logique du code :

  1. Parcourir les deux chaînes simultanément, caractère par caractère, jusqu'à atteindre n caractères ou la fin de l'une des chaînes.
  2. Comparer les caractères correspondants :
    • Si une différence est trouvée, retourner la différence entre les valeurs des caractères.
    • Si les caractères sont identiques, continuer la comparaison.
  3. Si aucune différence n'est trouvée après n caractères, retourner 0.

ft_strnstr

  • Prototype :
char *ft_strnstr(const char *haystack, const char *needle, size_t len);
  • But de la fonction : ft_strnstr recherche la première occurrence de la sous-chaîne needle dans la chaîne haystack, en limitant la recherche aux len premiers caractères de haystack. Si needle est une chaîne vide, haystack est retournée ; si needle n'est pas trouvée, NULL est retourné.

  • Contexte d'utilisation : Cette fonction est utile pour rechercher une sous-chaîne dans une portion spécifique d'une chaîne plus grande, par exemple pour analyser des segments de texte ou des buffers avec des limites définies.

  • Logique du code :

  1. Si needle est vide, retourner haystack.
  2. Parcourir haystack jusqu'à len caractères :
    • Pour chaque position, vérifier si les caractères suivants correspondent à needle.
    • Si une correspondance complète est trouvée, retourner un pointeur vers le début de cette occurrence dans haystack.
  3. Si aucune correspondance n'est trouvée après avoir parcouru jusqu'à len caractères, retourner NULL.

ft_strmapi

  • Prototype :
char *ft_strmapi(char const *s, char (*f)(unsigned int, char));
  • But de la fonction : ft_strmapi applique une fonction f à chaque caractère de la chaîne s pour créer une nouvelle chaîne résultant des applications successives de f. La fonction f reçoit en arguments l'index du caractère et le caractère lui-même.

  • Contexte d'utilisation : Cette fonction est utile pour transformer une chaîne en appliquant une opération spécifique à chaque caractère, comme changer la casse des lettres ou effectuer des substitutions basées sur la position.

  • Logique du code :

  1. Allouer de la mémoire pour la nouvelle chaîne, de longueur égale à s.
  2. Parcourir chaque caractère de s :
    • Appliquer la fonction f en passant l'index et le caractère actuel.
    • Stocker le résultat dans la nouvelle chaîne.
  3. Ajouter un caractère nul à la fin de la nouvelle chaîne.
  4. Retourner la nouvelle chaîne.

ft_striteri

  • Prototype :
void ft_striteri(char *s, void (*f)(unsigned int, char *));
  • But de la fonction : ft_striteri permet d'appliquer une fonction spécifique à chaque caractère d'une chaîne, en fournissant l'index du caractère et son adresse. Cela est utile pour modifier ou analyser chaque caractère en fonction de sa position dans la chaîne.

  • Contexte d'utilisation : Cette fonction est particulièrement utile lorsque vous devez transformer ou analyser une chaîne de caractères en tenant compte de la position de chaque caractère. Par exemple, vous pouvez l'utiliser pour convertir les lettres en majuscules à des positions paires et en minuscules à des positions impaires.

  • Logique du code :

  1. La fonction commence par vérifier si la chaîne s et le pointeur de fonction f ne sont pas nuls. Si l'un d'eux est nul, la fonction retourne immédiatement, car il n'y a rien à traiter.
  2. Une variable i de type unsigned int est initialisée à 0. Cette variable servira d'index pour parcourir la chaîne.
  3. La fonction entre dans une boucle qui continue tant que le caractère actuel de la chaîne n'est pas le caractère nul \0, indiquant la fin de la chaîne.
  4. À chaque itération, la fonction f est appelée avec deux arguments : l'index actuel i et l'adresse du caractère correspondant dans la chaîne (&s[i]). Cela permet à la fonction f de modifier le caractère en place, si nécessaire.
  5. Après l'appel de la fonction f, l'index i est incrémenté pour passer au caractère suivant de la chaîne.
  6. La boucle continue jusqu'à ce que tous les caractères de la chaîne aient été traités, c'est-à-dire jusqu'à ce que le caractère nul \0 soit rencontré.

🔄 Conversion

ft_atoi

  • Prototype :

    int ft_atoi(const char *str);
    
  • But de la fonction : La fonction ft_atoi convertit une chaîne de caractères, représentée par str, en une valeur entière de type int. Elle ignore les espaces blancs initiaux, gère un signe facultatif ('+' ou '-') et convertit les chiffres consécutifs en une valeur numérique jusqu'à rencontrer un caractère non numérique.

  • Contexte d'utilisation : ft_atoi est utile pour interpréter des nombres entiers présents sous forme de chaînes de caractères, par exemple lors de la lecture d'entrées utilisateur ou de données textuelles nécessitant une conversion en entiers pour des calculs ultérieurs.

  • Logique du code :

  1. Ignorer les espaces blancs initiaux : Parcourir la chaîne jusqu'à ce que le premier caractère non blanc soit trouvé.
  2. Déterminer le signe : Vérifier si le caractère suivant est un signe '+' ou '-'. Si c'est '-', définir le signe du résultat comme négatif.
  3. Conversion des chiffres : Parcourir les caractères suivants tant qu'ils sont numériques, en convertissant chaque caractère en sa valeur numérique correspondante et en l'ajoutant au résultat en cours, tout en gérant la position décimale appropriée.
  4. Retourner le résultat : Appliquer le signe déterminé précédemment au résultat numérique et le retourner.

ft_itoa

  • Prototype :

    char *ft_itoa(int n);
    
  • But de la fonction : La fonction ft_itoa convertit une valeur entière n en une chaîne de caractères allouée dynamiquement, représentant le nombre en notation décimale. Elle gère les nombres négatifs en ajoutant un signe '-' au début de la chaîne résultante.

  • Contexte d'utilisation : ft_itoa est utile lorsque vous devez convertir des entiers en chaînes de caractères, par exemple pour afficher des nombres à l'écran, les écrire dans des fichiers texte ou les transmettre via des protocoles textuels.

  • Logique du code :

  1. Déterminer la longueur de la chaîne : Calculer le nombre de chiffres dans n, en incluant un caractère supplémentaire pour le signe si n est négatif.
  2. Allocation de mémoire : Allouer suffisamment de mémoire pour stocker la chaîne résultante, y compris le caractère nul terminal.
  3. Remplissage de la chaîne : Remplir la chaîne en partant de la fin :
    • Si n est négatif, convertir n en sa valeur absolue pour simplifier le traitement.
    • Extraire chaque chiffre en utilisant le modulo 10 et le convertir en caractère en ajoutant '0'.
    • Placer le caractère correspondant dans la position appropriée de la chaîne.
    • Diviser n par 10 et répéter jusqu'à ce que tous les chiffres soient traités.
  4. Ajouter le signe : Si le nombre était négatif, ajouter un signe '-' au début de la chaîne.
  5. Terminer la chaîne : Ajouter le caractère nul terminal pour marquer la fin de la chaîne.
  6. Retourner la chaîne : Retourner le pointeur vers la chaîne nouvellement créée.

🔍 Tests de caractères

ft_isalpha

  • Prototype :

    int ft_isalpha(int c);
    
  • But de la fonction : La fonction ft_isalpha vérifie si le caractère passé en argument est une lettre alphabétique, qu'elle soit majuscule ou minuscule.

  • Contexte d'utilisation : Utile pour déterminer si un caractère est une lettre, par exemple lors de l'analyse de chaînes de texte où la distinction entre lettres et autres caractères est nécessaire.

  • Logique du code :

  1. Vérifier si la valeur de c correspond aux codes ASCII des lettres majuscules (65 à 90) ou minuscules (97 à 122).
  2. Retourner une valeur non nulle (par exemple, 1) si c est une lettre, sinon retourner 0.

ft_isdigit

  • Prototype :

    int ft_isdigit(int c);
    
  • But de la fonction : La fonction ft_isdigit vérifie si le caractère passé en argument est un chiffre décimal (de '0' à '9').

  • Contexte d'utilisation : Utile pour identifier les caractères numériques dans une chaîne, par exemple lors de la validation d'entrées utilisateur ou de l'analyse de données numériques.

  • Logique du code :

  1. Vérifier si la valeur de c correspond aux codes ASCII des chiffres (48 à 57).
  2. Retourner une valeur non nulle si c est un chiffre, sinon retourner 0.

ft_isalnum

  • Prototype :

    int ft_isalnum(int c);
    
  • But de la fonction : La fonction ft_isalnum vérifie si le caractère passé en argument est soit une lettre alphabétique, soit un chiffre décimal.

  • Contexte d'utilisation : Utile pour déterminer si un caractère est alphanumérique, par exemple lors de la validation de noms d'utilisateur ou d'identifiants qui doivent contenir uniquement des lettres et des chiffres.

  • Logique du code :

  1. Vérifier si c est une lettre en utilisant ft_isalpha.
  2. Si ce n'est pas une lettre, vérifier si c est un chiffre en utilisant ft_isdigit.
  3. Retourner une valeur non nulle si c est alphanumérique, sinon retourner 0.

ft_isascii

  • Prototype :

    int ft_isascii(int c);
    
  • But de la fonction : La fonction ft_isascii vérifie si le caractère passé en argument appartient au jeu de caractères ASCII standard (valeurs de 0 à 127).

  • Contexte d'utilisation : Utile pour s'assurer qu'un caractère est bien un caractère ASCII standard, notamment lors de traitements où seuls ces caractères sont acceptés.

  • Logique du code :

  1. Vérifier si la valeur de c est comprise entre 0 et 127 inclus.
  2. Retourner une valeur non nulle si c est un caractère ASCII, sinon retourner 0.

ft_isprint

  • Prototype :

    int ft_isprint(int c);
    
  • But de la fonction : La fonction ft_isprint vérifie si le caractère passé en argument est un caractère imprimable, y compris l'espace.

  • Contexte d'utilisation : Utile pour déterminer si un caractère peut être affiché, par exemple lors de l'affichage de chaînes où les caractères non imprimables doivent être traités différemment.

  • Logique du code :

  1. Vérifier si la valeur de c est comprise entre 32 (espace) et 126 (tilde) inclus, correspondant aux caractères imprimables en ASCII.
  2. Retourner une valeur non nulle si c est un caractère imprimable, sinon retourner 0.

🧠 Manipulation de la mémoire

ft_memset

  • Prototype :

    void *ft_memset(void *b, int c, size_t len);
    
  • But de la fonction : La fonction ft_memset remplit les len premiers octets de la zone mémoire pointée par b avec la valeur constante c, convertie en unsigned char.

  • Contexte d'utilisation : Utile pour initialiser une zone mémoire avec une valeur spécifique, comme la mise à zéro d'un bloc de mémoire après une allocation dynamique.

  • Logique du code :

  1. Convertir le pointeur b en unsigned char * pour une manipulation byte par byte.
  2. Parcourir les len octets et assigner la valeur c à chaque position.
  3. Retourner le pointeur initial b.

ft_memcpy

  • Prototype :

    void *ft_memcpy(void *dst, const void *src, size_t n);
    
  • But de la fonction : La fonction ft_memcpy copie n octets de la zone mémoire src vers la zone mémoire dst. Les zones ne doivent pas se chevaucher.

  • Contexte d'utilisation : Utile pour copier des blocs de mémoire lorsque les zones source et destination sont distinctes, comme lors de la duplication de structures ou de buffers.

  • Logique du code :

  1. Convertir les pointeurs dst et src en unsigned char * pour une manipulation byte par byte.
  2. Copier les n octets de src vers dst.
  3. Retourner le pointeur dst.

ft_memmove

  • Prototype :

    void *ft_memmove(void *dst, const void *src, size_t len);
    
  • But de la fonction : La fonction ft_memmove copie len octets de src vers dst. Contrairement à ft_memcpy, elle gère correctement le chevauchement des zones mémoire.

  • Contexte d'utilisation : Préférable à ft_memcpy lorsque les zones source et destination peuvent se chevaucher, comme lors du déplacement de données au sein d'un même buffer.

  • Logique du code :

  1. Si dst est avant src, copier les octets de début à fin.
  2. Sinon, copier les octets de fin à début pour éviter l'écrasement des données.
  3. Retourner le pointeur dst.

ft_memchr

  • Prototype :

    void *ft_memchr(const void *s, int c, size_t n);
    
  • But de la fonction : La fonction ft_memchr recherche la première occurrence de l'octet c (converti en unsigned char) dans les n premiers octets de la zone mémoire pointée par s.

  • Contexte d'utilisation : Utile pour localiser un caractère spécifique dans un bloc de mémoire, comme la recherche d'un délimiteur dans des données binaires.

  • Logique du code :

  1. Parcourir les n octets de s.
  2. Si un octet correspond à c, retourner un pointeur vers cet octet.
  3. Si aucune correspondance n'est trouvée, retourner NULL.

ft_memcmp

  • Prototype :

    int ft_memcmp(const void *s1, const void *s2, size_t n);
    
  • But de la fonction : La fonction ft_memcmp compare les n premiers octets des zones mémoire s1 et s2.

  • Contexte d'utilisation : Utile pour déterminer l'ordre lexicographique de blocs de mémoire, comme lors du tri de données binaires.

  • Logique du code :

  1. Parcourir les n octets des deux zones mémoire.
  2. Comparer chaque paire d'octets.
  3. Retourner la différence entre les premiers octets différents, ou 0 si les n octets sont identiques.

ft_bzero

  • Prototype :

    void ft_bzero(void *s, size_t n);
    
  • But de la fonction : La fonction ft_bzero met à zéro (remplit avec des octets de valeur 0) les n premiers octets de la zone mémoire pointée par s.

  • Contexte d'utilisation : Souvent utilisée pour initialiser une zone mémoire allouée dynamiquement afin d'éviter des valeurs indéfinies.

  • Logique du code :

  1. Appeler ft_memset avec c égal à 0 pour remplir la zone mémoire avec des zéros.

ft_calloc

  • Prototype :

    void *ft_calloc(size_t count, size_t size);
    
  • But de la fonction : La fonction ft_calloc alloue de la mémoire pour un tableau de count éléments de size octets chacun et initialise tous les octets à zéro.

  • Contexte d'utilisation : Utile pour allouer de la mémoire pour des structures de données tout en garantissant que la mémoire est initialisée à zéro, évitant ainsi des comportements indéfinis.

  • Logique du code :

  1. Calculer la taille totale nécessaire en multipliant count par size.
  2. Utiliser malloc pour allouer la mémoire.
  3. Si l'allocation réussit, utiliser ft_bzero pour initialiser la mémoire à zéro.
  4. Retourner le pointer.

📝 Manipulation de fichiers

ft_putchar_fd

  • Prototype :

    void ft_putchar_fd(char c, int fd);
    
  • But de la fonction : La fonction ft_putchar_fd écrit le caractère c sur le descripteur de fichier spécifié par fd.

  • Contexte d'utilisation : Utile pour envoyer des caractères vers différents descripteurs de fichiers, tels que la sortie standard, les fichiers ou les sockets, en fonction de la valeur de fd.

  • Logique du code :

  1. Utiliser l'appel système write pour écrire le caractère c sur le descripteur de fichier fd.
  2. Le premier argument de write est le descripteur de fichier, le second est l'adresse du caractère, et le troisième est la taille à écrire (1 octet).

ft_putstr_fd

  • Prototype :

    void ft_putstr_fd(char *s, int fd);
    
  • But de la fonction : La fonction ft_putstr_fd écrit la chaîne de caractères s sur le descripteur de fichier spécifié par fd.

  • Contexte d'utilisation : Permet d'envoyer des chaînes de caractères vers différents descripteurs de fichiers, facilitant ainsi l'affichage ou l'enregistrement de textes.

  • Logique du code :

  1. Vérifier que la chaîne s n'est pas nulle.
  2. Utiliser l'appel système write pour écrire la chaîne s sur le descripteur de fichier fd.
  3. La longueur de la chaîne peut être déterminée à l'aide de ft_strlen(s).

ft_putendl_fd

  • Prototype :

    void ft_putendl_fd(char *s, int fd);
    
  • But de la fonction : La fonction ft_putendl_fd écrit la chaîne de caractères s suivie d'un saut de ligne (\n) sur le descripteur de fichier spécifié par fd.

  • Contexte d'utilisation : Pratique pour écrire des lignes complètes de texte avec un retour à la ligne, par exemple lors de la génération de fichiers texte ou de l'affichage de messages.

  • Logique du code :

  1. Vérifier que la chaîne s n'est pas nulle.
  2. Utiliser ft_putstr_fd pour écrire la chaîne s sur le descripteur fd.
  3. Utiliser ft_putchar_fd pour ajouter un saut de ligne (\n) sur le descripteur fd.

ft_putnbr_fd

  • Prototype :

    void ft_putnbr_fd(int n, int fd);
    
  • But de la fonction : La fonction ft_putnbr_fd écrit le nombre entier n sous forme de chaîne de caractères sur le descripteur de fichier spécifié par fd.

  • Contexte d'utilisation : Utile pour afficher ou enregistrer des valeurs numériques entières, en les convertissant en chaînes de caractères.

  • Logique du code :

  1. Gérer le cas où n est égal à INT_MIN en écrivant directement sa valeur, car sa valeur absolue dépasse la plage des entiers positifs.
  2. Si n est négatif, écrire le signe '-' et convertir n en sa valeur absolue.
  3. Si n est supérieur ou égal à 10, appeler récursivement ft_putnbr_fd avec n / 10 pour traiter les chiffres supérieurs.
  4. Écrire le dernier chiffre de n en utilisant ft_putchar_fd.