IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

[Parsing] Comportement bizarre, variable $PATH


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 1
    Par défaut [Parsing] Comportement bizarre, variable $PATH
    Bonjour à tous,

    Voilà, j'ai un petit soucis avec un programme.
    En fait, j'ai une partie "parsing", représenté par la fonction my_parse, qui récupère les valeurs des variables d'environnement de mon système. Celle que j'ai fait, récupère la variable $PATH, qui se présente ainsi :
    /usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
    Le truc, c'est qu'il me fallait chaque répertoire, que je remplace le ':' par un espace, et que j'ajoute un '/' à la fin de chaque répertoire.

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    char    *my_parse(char **envp)
    {
      int   i;
      int   j;
      int   k;
      char  *var;
     
      i = 0;
      j = 0;
      k = 0;
      var = malloc(5000);
      while (envp[i] != NULL && my_strncmp(envp[i], "PATH", 4) != 0)
        i++;
      if (envp[i] == NULL)
        return (0);
      j += 5;
      while (envp[i][j] != '\n' && envp[i][j])
        {
          if (envp[i][j] == ':')
            {
              envp[i][j] = ' ';
              var[k++] = '/';
            }
          var[k++] = envp[i][j];
          j++;
        }
      var[k-1] = '/';
      return (var);
    }
     
    /* int  main(int argc, char **argv, char **envp) */
    /* { */
    /*   puts(my_parse(envp)); */
    /* } */
    Quand je décommente mon main dans ce programme, que je compile, et que je le lance, il me renvoie bien ce que je veux, c'est-à-dire :

    /usr/local/bin/ /usr/bin/ /bin/ /usr/local/games/ /usr/game/
    Par contre, lorsque j'utilise cette même fonction dans un fichier différent, il me renvoie ceci :
    /usr/local/bin /usr/bin /bin /usr/local/games /usr/game/
    Il ne me met pas les '/' à la fin de chaque répertoire...
    Je comprends vraiment pas d'où vient mon soucis, sachant que dans l'autre fichier, je fais juste un :
    Si quelqu'un pouvait me mettre sur la piste, ce serait gentil.

    Merci à tous.

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Par contre, lorsque j'utilise cette même fonction dans un fichier différent, il me renvoie ceci :
    Là, c'est beaucoup trop vague. On ne peut pas deviner comment est codé ce fichier.

    Par contre en faisant
    tu tentes de modifier un caractère d'une chaine constante, ce qui est censé provoquer un crash.

    Avant de rajouter un slash à la fin de chaque chemin, vérifie aussi s'il n'y en a pas déjà un.
    Vérifie aussi s'il n'y a pas deux deux-points qui se suivent (si j'ai bien compris le man, cela correspond au répertoire courant), sinon cela rajoute un slash à ta liste, c'est-à-dire la racine des répertoire (!!). Même chose lors d'un deux-points au début ou à la fin.

    Il faut tester toutes les situations possibles.

  3. #3
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2012
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 190
    Par défaut sous windows
    ton programme fonctionne très bien en compilant en 2 fichiers séparés.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    tcc -c my.c
    tcc test.c my.o
    j'ai dû changer my_strncmp en strncmp(strncmp(envp[i], "Path=", 5) et les ':' en ';' windows oblige) et la ligne 29 car sinon il te mange le dernier caractère du path (game au lieu de games). la production me donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C:\Program Files\QuickTime\QTSystem\/ C:\texlive\2010\bin\win32/ C:\Program Files\Lua\5.1/ C:\Program Files\Lua\5.1\clibs/ C:\tcc/
    ce qui montre le cas des chemins se terminant par un '\' sous windows ...
    mais je ne sais pas si ce cas peut se produire sous linux.
    le mystère persiste pour la perte du '/' dans ton cas ...
    A+

  4. #4
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2012
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2012
    Messages : 190
    Par défaut
    je viens de tester ton programme avec tiny C et avec GCC sous linux et le résultat de la compil avec 2 fichiers fonctionne comme il se doit.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    # gcc -c my.c
    # gcc test_my.c my.o
    test_my.c: In function ‘main’:
    test_my.c:5: warning: passing argument 1 of ‘puts’ makes pointer from integer without a cast
    /usr/include/stdio.h:668: note: expected ‘const char *’ but argument is of type ‘int# ./a.out
    /bin/ /usr/bin/ /sbin/ /usr/sbin/ /usr/local/bin/ /usr/X11R7/bin/ /root/my-applications/bin/
    je ne vois toujours pas l'origine de ton problème. regarde quand même en remplaçant 'puts(...)' par 'printf("%s\n", ...)', qui supprime le warning puisqu'il s'attend à des données de taille compatible avec le format.

    et au fait, quel compilateur utilises-tu ?

    A+

Discussions similaires

  1. Une variable boléenne qui se comporte bizarrement
    Par renaud26 dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 05/11/2014, 18h28
  2. Comportement bizarre d'une variable dynamique
    Par scoutiste dans le forum Débuter
    Réponses: 4
    Dernier message: 21/08/2013, 13h36
  3. Réponses: 4
    Dernier message: 10/08/2006, 18h11
  4. Comportement bizarre de variables d'applications
    Par ahage4x4 dans le forum ASP
    Réponses: 2
    Dernier message: 14/11/2005, 11h51
  5. [Sybase] Comportement bizarre d'une table
    Par sdozias dans le forum Sybase
    Réponses: 4
    Dernier message: 03/02/2004, 10h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo