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 :

Problème tableaux de chaines de caractères


Sujet :

C

  1. #1
    Candidat au Club
    Inscrit en
    Novembre 2009
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Problème tableaux de chaines de caractères
    Bonjour,

    Je dois faire un programme en C et je rencontre un problème avec les tableaux de chaînes de caractères.

    Je vous ai collé une partie de mon programme ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int nb_equipes, nb_etapes;
    char nom_equipe[20];
     
    fscanf(flec, "%d%d", &nb_etapes, &nb_equipes);
    char * tab_equipes[nb_equipes];
     
    for (i=0;i<nb_equipes;i++){
       fscanf(flet,"%s",nom_equipe);
       tab_equipes[i] = nom_equipe;
       printf(" equipe %d : %s \n",i,tab_equipes[i]);
    }
    Avec la fonction fscanf je veux copier un nom d'équipe dans la variable nom_equipe (ceci marche très bien).
    Ensuite, je veux copier la valeur de cette variable dans le tableau tab_equipes. Le problème est que c'est l'adresse de la variable nom_equipe qui est copiée.

    Après être repassé dans la boucle for plusieurs fois, les valeurs contenues dans tab_equipes sont toutes identiques (et égales à la dernière valeur prise par nom_equipe) alors qu'elles devraient être toutes différentes... Ceci est dû au fait que c'est l' adresse de nom_equipe qui a été copiée dans le tableau et pas sa valeur...

    Comment je peux contourner ce problème ?

    Merci de votre aide.

  2. #2
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    La copie des chaînes de caractères se fait avec strcpy() et assimilées et non avec = qui ne copie que l'adresse.
    Par contre, cela nécessite d'avoir allouer la mémoire pour contenir la chaîne:
    • Soit en utilisant un tableau bidimensionnel à la place de tab_equipes (et en prenant garde à ne pas avoir de débordement lors de la copie)
    • Soit en allouant la mémoire nécessaire avec malloc() avant la copie.


    Si tu travailles dans un environnement Posix et que la portabilité n'est pas un facteur important pour toi [1], tu peux également te pencher sur la fonction strdup().



    [1] Sachant qu'il est de toute manière assez simple de réimplementer la fonction strdup() à partir de malloc() et strcpy() sur les systèmes n'en disposant pas.

  3. #3
    Candidat au Club
    Inscrit en
    Novembre 2009
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Résolu
    Avec strcpy et une allocation ça marche très bien!

    Merci beaucoup.

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 06/05/2007, 21h47
  2. Problème classe perso chaine de caractères
    Par stof dans le forum Visual C++
    Réponses: 2
    Dernier message: 06/05/2007, 11h42
  3. Réponses: 5
    Dernier message: 26/07/2006, 11h13
  4. Réponses: 3
    Dernier message: 26/05/2006, 19h49
  5. [Tableaux] Interprétation chaine de caractères
    Par yAnSoLo82 dans le forum Langage
    Réponses: 7
    Dernier message: 27/10/2005, 09h18

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