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 -
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 :
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.
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 :

pouvez vous m'aider???? merci d'avance :D
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
-
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); }

-
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???- 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.
-