Probleme de declaration d'une chaine dynamique

wisley80 Messages postés 12 Date d'inscription   Statut Membre Dernière intervention   -  
zedzet Messages postés 18 Statut Membre -
Bonjours les CCM :)

je suis entrain de faire un Projet de jeu à plusieurs joueur en C et pour enregistrer leur info; j'ai crée une liste chainé contenant le nom et le score de chaque joueur ; que je vais ensuit enregistrer dans un fichier binaire .dat ou .bin pour conserver le meilleur score :
typedef struct Joueur Joueur;
 
struct Joueur {
    char *nom;
    int *score;
    Joueur *suiv;
};


Mon problème c que je ne connais pas la taille du nom du joueur :( sa c que j'ai essaye de faire mais apparemment sa ne marche pas.
char *nom= (char*)malloc(sizeof(char));
Joueur *ListJoueur=malloc(sizeof(Joueur));
 
 
printf("**********Jouer************\n\n");
           do{
               printf("Donner le nombre de joueur:");
               scanf("%d",&nbrj);
           }while (i<1);
 
            for (i=1;i<=nbrj;i++)
            {
               printf("donner le nom du joueurn°%d:",i);
               scanf("%s",nom);
               printf("%s",nom);
               Ajouterjoueur(ListJoueur,nom);
            };


le printf me donne exactement la chaine comme je l'écris dans le scanf mais après sa plainte!!!! :'(

la fonction qui ajoute le nouveau joueur dans la liste :
void Ajouterjoueur (Joueur *j, char *nom){
    Joueur *cour=j;
    Joueur *tmp=malloc(sizeof(Joueur));
 
    while (cour->suiv!=NULL){
        cour=cour->suiv;
    }
    tmp->nom=nom;
    cour->suiv=tmp;
    tmp->suiv=NULL;
}



pouvez vous m'aider???? merci d'avance :D

1 réponse

  1. zedzet Messages postés 18 Statut Membre 8
     
    Bonjour,
    je viens d'analyser votre code et j'ai découvert cette ligne dans votre typedef :

    char *nom;
    


    or à chaque itération vous avez mis

    tmp->nom=nom;
    


    ce qui veut dire que vous luis affecter la même adresse de variable (qui contient la dernière valeur lue).

    et il ya aussi dans la fonction Ajouterjoueur :
    il faut mettre :
     cour->nom=nom;
     cour->suiv=tmp;
     tmp->suiv=NULL;
    


    voici une petite rectification de vos petites erreurs , j'ai ajouter deux lignes pour afficher les 2 premier nom de joueur (pour vérifier):
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct Joueur Joueur;
    
    struct Joueur {
        char *nom;
        int *score;
        Joueur *suiv;
    };
    
    Joueur* Ajouterjoueur (Joueur *j, char *nom)
    {
        int k,L ;
        char *nom_joueur = NULL;
        Joueur *cour=j;
        Joueur *tmp=malloc(sizeof(Joueur));
    
        /// copier le nom dans nom_joueur :
        L = strlen(nom);
        nom_joueur = (char*)malloc((L+1)*sizeof(char));
        strcpy(nom_joueur,nom);
    
        while (cour->suiv!=NULL)
        {
            cour=cour->suiv;
        }
        cour->nom = nom_joueur;
        cour->suiv = tmp;
        tmp->suiv = NULL;
    
        return(cour);
    }
    
    int main()
    {
        int i,nbrj=0;
        char *nom = NULL;
        Joueur *ListJoueur = NULL;
        Joueur *Tete_ListJoueur = NULL;
    
    
        nom = (char*)malloc(sizeof(char));
        ListJoueur=malloc(sizeof(Joueur));
    
        /// sauvgarder l'adresse de la tete de liste :
        Tete_ListJoueur = ListJoueur;
    
    
        printf("**********Jouer************\n\n");
    
    
        do
        {
            printf("Donner le nombre de joueur : ");
            scanf("%d",&nbrj);
        }while (nbrj<1);
    
    
        for (i=1;i<=nbrj;i++)
        {
            printf("donner le nom du joueur N°%d :",i);
            scanf("%s",nom);
            printf("%s\n",nom);
            ListJoueur = Ajouterjoueur(ListJoueur,nom);
        };
    
        /// afficher les deux premier nom de joueur :
        printf("\n\n\n");
        printf("affichage du contenu : \n");
        printf("%s\n",Tete_ListJoueur->nom);
        printf("%s\n",Tete_ListJoueur->suiv->nom);
        //printf("%s\n",Tete_ListJoueur->suiv->suiv->nom);
    
    }
    


    0
    1. wisley80 Messages postés 12 Date d'inscription   Statut Membre Dernière intervention  
       
      merci :D beaucoup pour votre aide ça me permet de corriger plusieurs erreur :)

      mais à l'exécution d'un copier coller de votre code sa ne marche pas le programme s'arrête de fonctionner juste après que je tape le nom du 1 joueur "AAA" et qu'il l'affiche "AAA"
      avec l'erreur ""Process terminated with status 255 (9 minute(s), 40 second(s))""

      est-ce que sa peut etre a cause de mon PC ???? :/
      sinon pourquoi sa marche pour vous et moi non???
      0
      1. zedzet Messages postés 18 Statut Membre 8 > wisley80 Messages postés 12 Date d'inscription   Statut Membre Dernière intervention  
         
        oui probablement ,je n'en suis pas sure mais si vous êtes sur code::blocks
        allez dans
        setting-> envirenement
        (vous etes alors sur general setting)
        modifier alors le champs tout en bas :
        terminal to lunch console programs
        choisissez n'importe quoi (enfin modifier et re-compiller)
        j'espère que cela vous aidera sinon copier-coller le message d'erreur et lancer un recherche google vous tomberai probablement sur des millier de cas similaire :p
        bonne chance.
        0