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 :

Demande confirmation fonctionnement strcat


Sujet :

C

  1. #1
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 721
    Points : 43 825
    Points
    43 825
    Par défaut Demande confirmation fonctionnement strcat
    Bonjour,

    J'utilise le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char *path=getcwd(NULL,0);
    strcat(path,":");
    strcat(path,getenv("PATH"));
    Ce code me permet tout simplement d'ajouter le dossier en cours au début de la variable d'environnement path. Cela fonctionne très bien.

    Cependant la doc de strcat précise que la chaine de destination doit être suffisamment grande pour contenir l'ajout. Dans mon cas, ma chaine a été allouée par getcwd. Je présume que mon code fonctionne car l'allocation dépasse les besoins. Mais si je ne gère pas, je dois m'attendre à un beau bug.

    Je pensais donc avant l'utilisation de strcat utiliser realloc en donnant la taille necessaire. (strlen sur path + strlen de getenv("PATH"))

    Merci de vos retours.

  2. #2
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 842
    Points
    7 842
    Par défaut
    Voilà comment je ferais en me cantonnant à du code portable:
    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
    #include <unistd.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
     
    ...
     
    char *path;
    int path_max=pathconf(".", _PC_PATH_MAX);
    int size=((path_max==-1)?1024:path_max);
    path=malloc(size+1+strlen(getenv("PATH")));
    getcwd(path,size);
    strcat(path,":");
    strcat(path,getenv("PATH"));
    printf("%s\n",path);
    Un problème est que la longueur du chemin vers le répertoire courant peut être plus grande que _PC_PATH_MAX ...

    Voilà une version qui s'adapte à la longueur du nom du répertoire courant:

    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
    #include <unistd.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <errno.h>
     
    ...
     
      char *path;
      int size=1024;
      path=malloc(size+1+strlen(getenv("PATH")));
      while(getcwd(path,size)==NULL) {
        if(errno==ERANGE)
        {
          size*=2;
          free(path);
          path=malloc(size+1+strlen(getenv("PATH")));
        }
        else
        {
          exit(1);
        }
      }
      strcat(path,":");
      strcat(path,getenv("PATH"));
    Si tu es sûr que ton code s'exécutera avec une libc contenant un getcwd qui supporte un pointeur et une longueur nuls, tu peux faire plus simple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char *path=getcwd(NULL,0);
    path=realloc(path,strlen(path)+2+strlen(getenv("PATH")));
    strcat(path,":");
    strcat(path,getenv("PATH"));

  3. #3
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 721
    Points : 43 825
    Points
    43 825
    Par défaut
    Merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Demande confirmation SGBD
    Par nicodn02 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 10/04/2007, 15h49
  2. [XML] demande confirmation structure XML
    Par areuh_fr dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 15/11/2006, 23h34
  3. demande confirmations ?!
    Par chrono23 dans le forum C++
    Réponses: 6
    Dernier message: 18/10/2006, 13h56
  4. Réponses: 4
    Dernier message: 04/04/2006, 16h09
  5. Réponses: 6
    Dernier message: 09/07/2004, 15h07

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