Annonce

Réduire
Aucune annonce.

[Exercice] Écrire une fonction python en C

Réduire
X
 
  • Filtre
  • Heure
  • Afficher
Tout nettoyer
nouveaux messages

  • [Exercice] Écrire une fonction python en C

    Bonjour,

    Imaginons que nous avons un chemin de fichier et que nous nous intéressions qu'à son nom (sans le chemin)

    exemple: soit le chemin suivant,

    Code:
    /home/fred1599/fichier.txt
    L'objectif sera d'avoir le résultat suivant,

    Code:
    fichier.txt
    En python on fera cela simplement

    Code:
    >>> PATH = "/home/fred1599/fichier.txt"
    >>> import os.path
    >>> os.path.basename(PATH)
    'fichier.txt'
    En bash,

    Code:
    [email protected]:~$ basename '/home/fred1599/test.txt'
    test.txt
    On va donc créer une implémentation de cette fonction (basename) en C, mais vous inquiétez pas, je ne vais pas vous laisser sans aide

    LES DIFFÉRENTES ÉTAPES

    Nous aurons besoin de passer par plusieurs étapes
    1. Rendre le code portable, pas besoin de vous en inquiéter je m'en occupe pour vous
    2. Créer une fonction basename, prenant en argument le chemin du fichier à tronquer (path) et la chaîne resultat (contenant le résultat test.txt)


    PORTABILITÉ DU CODE

    Afin de ne pas faire de jaloux, nous allons rendre ce code compatible Unix et Windows, car comme vous le savez les chemins de fichiers ne sont pas de la même forme

    C:\Utilisateurs\fred1599\test.txt -> Windows
    /home/fred1599/test.txt -> Unix

    La différence entre les deux à part le chemin, c'est que le séparateur sous Windows est le caractère '\', alors que sous Unix c'est le caractère '/'.

    On va donc prévenir notre programme en détectant l'OS sur lequel on compilera notre code final, à l'aide de quelques lignes préprocesseur

    Code:
    #ifdef WIN32
        #define SEP 92 /* nombre ascii représentant le caractère '\' */
    #elif defined (unix)
        #define SEP 47 /* nombre ascii représentant le caractère '/' */
    #endif
    Dorénavant pour détecter le caractère '\' ou '/' nous aurons juste à utiliser la variable SEP.

    LA FONCTION BASENAME

    On vient à l'essentiel, notre fonction ne retourne rien, et doit entrer le résultat final dans une variable nommée resultat, sa signature sera,

    Code:
    void basename(char *path, char *resultat);
    C'est bien beau, mais comment je détecte le dernier caractère SEP ?
    1. On récupère l'index du dernier caractère SEP
    2. De l'index récupéré on ajoute dans resultat tous les caractères allant de path[index+1] jusqu'au caractère de fin de path, c'est à dire '\0'
    3. On ajoute le caractère de fin '\0' à resultat


    Comment tester ?

    Voici le main suivant que vous soyez sous Windows ou Unix

    Windows:

    Code:
    char myPath[] = "C:\\Utilisateurs\\fred1599\\test.txt";

    Unix
    :

    Code:
    char myPath[] = "/home/fred1599/test.txt";
    Le main

    Code:
    int main(void)
    {
        char myPath[] = /* À compléter par la chaîne ci-dessus selon votre OS ... */
        char resultat[200];
    
        basename(myPath, resultat);
    
        printf("%s\n", resultat);
    
        getchar(); /* pause pour Windows, compatible Unix */
    
        return 0;
    }
    SQUELETTE FINAL

    Voici le squelette du programme

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    
    #ifdef WIN32
        #define SEP 92
    #elif defined (unix)
        #define SEP 47
    #endif
    
    void basename(char *path, char *resultat);
    
    int main(void)
    {
        char myPath[] = "/home/fred1599/test.txt";
        char resultat[200];
    
        basename(myPath, resultat);
    
        printf("%s\n", resultat); /* Affichage du résultat */
    
        getchar();
    
        return 0;
    }
    
    void basename(char *path, char *resultat)
    {
        /* code à compléter */
    }
    Pour les balèzes en C, vous pouvez utiliser l'allocation dynamique et faire le boulot avec une construction du type

    Code:
    char *basename(char *path);
    Bonne continuation...

    Réponse par MP, merci par avance !

    À bientôt
Chargement...
X