Probleme de declaration d'une chaine dynamique

Fermé
wisley80 Messages postés 12 Date d'inscription mercredi 9 novembre 2011 Statut Membre Dernière intervention 7 mai 2015 - 7 mai 2015 à 00:46
zedzet Messages postés 18 Date d'inscription mardi 5 mai 2015 Statut Membre Dernière intervention 21 mai 2015 - 7 mai 2015 à 07:57
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
A voir également:

1 réponse

zedzet Messages postés 18 Date d'inscription mardi 5 mai 2015 Statut Membre Dernière intervention 21 mai 2015 8
Modifié par zedzet le 7/05/2015 à 03:18
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
wisley80 Messages postés 12 Date d'inscription mercredi 9 novembre 2011 Statut Membre Dernière intervention 7 mai 2015
7 mai 2015 à 04:02
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
zedzet Messages postés 18 Date d'inscription mardi 5 mai 2015 Statut Membre Dernière intervention 21 mai 2015 8 > wisley80 Messages postés 12 Date d'inscription mercredi 9 novembre 2011 Statut Membre Dernière intervention 7 mai 2015
7 mai 2015 à 07:57
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