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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 327
    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 : 18 327
    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.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  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
    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
    18 327
    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 : 18 327
    Par défaut
    Merci.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

+ 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