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 :

Strcat - 2 char -> chemin absolu


Sujet :

C

  1. #1
    Membre régulier
    Homme Profil pro
    Responsable ingénierie des logiciels - Recherche alternance
    Inscrit en
    Novembre 2013
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable ingénierie des logiciels - Recherche alternance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 68
    Points : 92
    Points
    92
    Par défaut Strcat - 2 char -> chemin absolu
    Bonjour,

    J'ai penché sur mon problème dans un peu tout les sens et pendant longtemps, mais je n'y arrive pas.
    Et pourtant on peut pas dire que strcat deux char soit d'une complexité extrême, mais bon ...

    Mon objectif était de pouvoir créer un chemin absolu à partir d'un char contenant un chemin "de base" (.ie commun à tous les chemins absolus auxquels j'aurais à faire).

    J'ai beau avoir regardé plein de fois les tuto de strcat, son man, et son prototype ... j'y arrive pas

    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
     
     char *rac_dir = NULL; rac_dir= (char *) malloc( 150 ) ; rac_dir = "C:\\Users\\Utilisateur\\Documents";
     char *rac_dir1 = NULL; rac_dir1= (char *) malloc( 60 );
     
     
     
    switch(choix_menu_1){
     
        case 1 :
            printf("\n2");
            rac_dir1 = "\\Prosit 17 - A&L C7\\Redoublement\\Enieme test\\main.c";
            printf("\n\nrac_dir vaut :  %s ", rac_dir); printf("\nrac_dir1 vaut : %s",rac_dir1);
            strcat (rac_dir, rac_dir1);
            printf("\n3");
            printf("\n rac_dir vaut : ' %s '\n", rac_dir);
            fichier = fopen(rac_dir, "r");
            lecture(fichier, rac_dir1);
            break;

    Comme vous pouvez le voir j'ai mis des printf un peu partout pour voir d'où le problème venait .
    Mes deux char : rac_dir et rac_dir1 ont les bonnes valeurs. Seulement une fois arriver au strcat, le programme plante .

    Merci d'avance pour votre aide.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    • rac_dir= (char *) malloc( 150 ) ; fais pointer rac_dir vers la zone allouée
    • rac_dir = "C:\\Users\\Utilisateur\\Documents"; fait pointer rac_dir vers l'emplacement qui stocke cette chaine

    Tu perds donc l'adresse de la zone allouée, et ne pourras pas la libérer avec free() => fuite de mémoire.
    La nouvelle zone (qui n'a plus rien à voir avec la zone allouée) n'est pas modifiable (voir le sujet de la FAQ Que signifie 'char * p = "Bonjour";' ?), tu ne peux donc pas y rajouter des caractères.
    (idem pour rac_dir1)

    Remplace donc ta seconde instruction par un strcpy.

  3. #3
    Membre régulier
    Homme Profil pro
    Responsable ingénierie des logiciels - Recherche alternance
    Inscrit en
    Novembre 2013
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable ingénierie des logiciels - Recherche alternance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 68
    Points : 92
    Points
    92
    Par défaut
    Merci bien. Jusque la je ne voyais vraiment l'utilité de strcpy.
    Par contre, même si j'ai réussit à initialiser mes chemins avec strcpy, et strcat pour obtenir le chemin absolu, je reste perplexe quant au fait que la deuxième chaine de caractère passé en argument de strcat soit modifié.
    Normalement (si je ne dit pas de bétise), seul le premier argument est modifié (rac_dir1 écrasant le \0 de rac_dir afin de venir se coller à la fin de la chaine) et le deuxième reste inchangé ...

  4. #4
    Membre régulier
    Homme Profil pro
    Responsable ingénierie des logiciels - Recherche alternance
    Inscrit en
    Novembre 2013
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable ingénierie des logiciels - Recherche alternance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 68
    Points : 92
    Points
    92
    Par défaut
    Autant pour moi, mauvaise manip'.
    Problème résolu, merci à toi Winjerome .

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Ojiuiookojbezib Voir le message
    Mes deux char : rac_dir et rac_dir1 ont les bonnes valeurs. Seulement une fois arriver au strcat, le programme plante .
    Bonjour
    Ce ne sont pas des "char" (des caractères) mais des "char étoile" (des pointeurs vers une zone contenant, elle, des caractères).
    N'oublie jamais le mot "étoile" quand tu décris un pointeur car c'est un mot important ; et tu écris autant de fois le mot "étoile" qu'il y a d'étoiles => char ***pt: pt est un char étoile étoile étoile. Ainsi tout habitué saura ce qu'est pt et comment on s'en sert.

    En lisant ton titre sans avoir lu le post je comprenais que dalle.

    Accessoirement, tu ne peux faire du strcat() que sur une zone (modifiable bien entendu comme l'a dit Winjerome) mais contenant déjà une vraie chaine, c'est à dire zéro à n caractères divers (généralement affichables mais c'est pas une condition impérative) mais surtout impérativement suivis par un '\0'.
    A toi de mettre ce '\0' comme tu veux. Soit à la main, soit en passant par une fonction dédiée au remplissage de chaines comme strcpy()...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. [Info]chemin absolu du projet courant
    Par slyos72 dans le forum Eclipse Platform
    Réponses: 2
    Dernier message: 30/05/2005, 10h06
  2. [langage] chemin absolu d un fichier
    Par nono1782 dans le forum Langage
    Réponses: 4
    Dernier message: 20/07/2004, 14h02
  3. Réponses: 5
    Dernier message: 07/05/2004, 09h44
  4. [langage] Création de dossier en chemin absolu
    Par Jibees dans le forum Langage
    Réponses: 4
    Dernier message: 25/04/2003, 10h57

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