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 <stdlib.h>

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 <stdio.h>

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 <stdlib.h>

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;
}
				
			

📋 Les exercices de C07 :

Les projets C de la piscine 42 :

Retour en haut