Piscine 42 C07 : les exercices corrigés
Il est temps de découvrir la fonction Malloc et ça tombe bien, le projet C07 met l’accent sur l’allocation dynamique de mémoire.
Découvres ci-dessous les solutions détaillées et commentées pour le projet C07 de la Piscine de l’école 42.
C07 ex00 : ft_strdup
🎯 Objectif de ft_strdup
L’objectif de cet exercice est de reproduire la fonction standard strdup
en C. Cette fonction alloue de la mémoire pour une nouvelle chaîne de caractères qui est une copie de la chaîne passée en paramètre, puis elle retourne un pointeur vers cette nouvelle chaîne.
🎓 Notions essententielles
- Allocation dynamique de mémoire : Utiliser
malloc
pour allouer suffisamment de mémoire pour la nouvelle chaîne, qui devra contenir tous les caractères de la chaîne source ainsi que le caractère nul de fin. - Copie de chaîne de caractères : Parcourir la chaîne source pour copier chacun de ses caractères dans la nouvelle chaîne allouée.
- Gestion de la mémoire : Veiller à bien retourner un pointeur vers la mémoire allouée, et à gérer les erreurs d’allocation.
💻 Fonctionnement de ft_strdup
Prototype de la fonction :
La fonction doit être déclarée comme suit : char *ft_strdup(char *src);
.
Elle prend en paramètre un pointeur vers la chaîne de caractères source (src
) et renvoie un pointeur vers la nouvelle chaîne de caractères dupliquée.
Calcul de la taille de la chaîne source :
Avant de copier la chaîne, il faut connaître sa longueur pour allouer la mémoire nécessaire. On peut le faire en parcourant la chaîne avec une boucle.
Allocation de mémoire pour la nouvelle chaîne :
Utiliser malloc
pour allouer de la mémoire en fonction de la longueur calculée de la chaîne source, en ajoutant 1 pour le caractère nul de fin.
Copie des caractères :
Une fois la mémoire allouée, utiliser une boucle pour copier chaque caractère de la chaîne source dans la nouvelle chaîne allouée.
Gestion des erreurs d’allocation :
Si malloc
échoue (c’est-à-dire retourne NULL
), la fonction doit également retourner NULL
.
✅ Le code de ft_strdup :
#include
char *ft_strdup(char *src)
{
int i;
char *dup;
i = 0;
while (src[i] != '\0')
i++;
dup = (char *)malloc((i + 1) * sizeof(char));
if (dup == NULL)
return NULL;
i = 0;
while (src[i] != '\0')
{
dup[i] = src[i];
i++;
}
dup[i] = '\0';
return dup;
}
💡Fonction Main pour tester ft_strdup
#include
int main(void)
{
printf("'%s'\n", ft_strdup(""));
printf("'%s'\n", ft_strdup("coucou"));
return (0);
}
C07 ex01 : ft_range
🎯 Objectif de ft_range
L’objectif de cet exercice est d’écrire une fonction qui retourne un tableau d’entiers contenant toutes les valeurs comprises entre min
et max
(min inclus, max exclu). Si min
est supérieur ou égal à max
, la fonction doit retourner un pointeur NULL
.
🎓 Notions essententielles
- Allocation dynamique de mémoire : Utiliser
malloc
pour allouer la mémoire nécessaire pour le tableau d’entiers. - Boucles : Utiliser une boucle pour remplir le tableau avec les valeurs allant de
min
àmax
. - Gestion des erreurs : Gérer les cas où
min
est supérieur ou égal àmax
et oùmalloc
échoue.
💻 Fonctionnement de ft_range
Prototype de la fonction :
La fonction doit être déclarée comme suit : int *ft_range(int min, int max);
. Elle prend en paramètres deux entiers (min
et max
) et renvoie un pointeur vers le tableau d’entiers.
Vérification des conditions de validité :
Si min
est supérieur ou égal à max
, la fonction doit immédiatement retourner NULL
.
Calcul de la taille du tableau :
Calculer le nombre d’éléments que contiendra le tableau, qui est égal à max - min
.
Allocation de mémoire pour le tableau :
Utiliser malloc
pour allouer suffisamment de mémoire pour contenir tous les entiers du tableau.
Remplissage du tableau :
Utiliser une boucle pour remplir le tableau avec les valeurs allant de min
à max
(min inclus, max exclu).
Gestion des erreurs d’allocation :
Si malloc
échoue, la fonction doit retourner NULL
.
✅ Le code de ft_range :
#include
int *ft_range(int min, int max)
{
int *range;
int i;
int size;
if (min >= max)
return NULL;
size = max - min;
range = (int *)malloc(size * sizeof(int));
if (range == NULL)
return NULL;
i = 0;
while (min < max)
{
range[i] = min;
min++;
i++;
}
return range;
}
💡Fonction Main pour tester ft_range
int main(void)
{
int *range;
int i;
range = ft_range(5, 10);
if (range != NULL)
{
for (i = 0; i < 5; i++)
printf("%d ", range[i]);
printf("\n");
free(range);
}
return 0;
}