Langage C : sous programme, type stucturé...

Fermé
matthymatt - 23 nov. 2009 à 19:13
 matthymatt - 26 nov. 2009 à 10:29
Bonjour, j'ai un soucis avec un programme en langage C. Il s'agit du début d'un jeu su style Morpion. En fait, je cherche simplement a récupérer les noms et marques des deux joueurs en début de partie, a l'aide d'un sous programme. Pour tester si tout avait été stocké dans les bonnes variables, j'ai essayer d'afficher le tout dans mon main. Seulement, le nom du premier joueur a été zappé, et pas moyen de l'afficher! Quoique j'essaie, je n'arrive jamais a stocké/afficher le nom du joueur 1... Quelle erreur y a t il svp?? Voila mon programme :

------------------------------------------------------------------------------------------------------------------------------

#include <stdio.h>
#include <stdlib.h>
#define DIMSTR 15

struct joueur{
char nom[DIMSTR];
char marque;
};
typedef struct joueur S_plyr;

void Remplir_joueur(S_plyr *player1, S_plyr *player2);


int main()
{
S_plyr joueur1;
S_plyr joueur2;
Remplir_joueur(&joueur1, &joueur2);

printf ("%s --> %c",joueur1.nom,joueur1.marque);
printf("\n");
printf ("%s --> %c",joueur2.nom,joueur2.marque);

return 0;
}

void Remplir_joueur(S_plyr *player1, S_plyr *player2)
{
printf("Nom joueur 1 : ");
scanf("%s",(*player1).nom);
printf("Marque joueur 1 : ");
scanf("%s",&(*player1).marque);
printf("\n");
printf("Nom joueur 2 : ");
scanf("%s",(*player2).nom);
printf("Marque joueur 2 : ");
scanf("%s",&(*player2).marque);
printf("\n");
}

------------------------------------------------------------------------------------------------------------------------------
A voir également:

6 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
23 nov. 2009 à 23:38
scanf("%s",&(*player1).marque);
marque est de type char. Il convient donc de mettre %c. Sinon cela écrira \0, ce qui écrasera des informations de la pile provoquant le crash.
De même pour player2.

Cdlt
1
nobie-cs Messages postés 155 Date d'inscription samedi 21 novembre 2009 Statut Membre Dernière intervention 15 mai 2010 17
23 nov. 2009 à 23:41
oups je l'ai pas vu :( je doit aller chez un opticien demain

pourquoi Remplir_joueur(&joueur2,&joueur1); a marche mais pas Remplir_joueur(&joueur1,&joueur2);
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844 > nobie-cs Messages postés 155 Date d'inscription samedi 21 novembre 2009 Statut Membre Dernière intervention 15 mai 2010
24 nov. 2009 à 00:16
pourquoi Remplir_joueur(&joueur2,&joueur1); a marche mais pas Remplir_joueur(&joueur1,&joueur2);
Les deux marchent ! Et heureusement ^^.
0
nobie-cs Messages postés 155 Date d'inscription samedi 21 novembre 2009 Statut Membre Dernière intervention 15 mai 2010 17 > fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022
24 nov. 2009 à 00:18
no j'ai essayer (&joueur1,&joueur2); mais sa na pas marcher :)

si tu met " (&joueur1,&joueur2);" le programme affiche :
>> a
nomjoueur2 >>b

si tu met " (&joueur2,&joueur1);" le programme affiche :
nomjoueur1 >> a
nomjoueur2 >> b
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844 > nobie-cs Messages postés 155 Date d'inscription samedi 21 novembre 2009 Statut Membre Dernière intervention 15 mai 2010
24 nov. 2009 à 06:28
Tu as peut-être mal copié quelque chose. En tout cas sur ma machine, je peux inverser il n'y a aucun
problème.

Par ailleurs, je constate un autre problème hors du %c au lieu %s pour le char. Il faut effectuer également un getchar() avant le scanf("%c", ...) pour éliminer le '\n' laissé dans le buffer clavier par le scanf("%s", ...).
Je tiens à rappeler également que l'utilisation du scanf("%s", ...) est à bannir puisqu'il n'y a aucun contrôle sur la taille et que si l'utilisateur écrit des mots de 20 caractères il y aura un joli segfault.

Cdlt
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
26 nov. 2009 à 06:26
Est-ce la qu'intervient le getchar() ? A quoi sert-il et comment s'en sert on ?
Exactement. Un simple getchar(); entre le scanf("%s") et le scanf("%c") te videra le \n du buffer.
getchar() lit un caractère du buffer clavier.

pourquoi, avant la modification des %s en %c le sous programme fonctionnait il lorsqu'on inversait les variables d'entrées??
Car lorsque tu mets le %s, la fonction de rajoutera un caractère de fin de chaîne ('\0'). Puisque la variable n'est qu'un char elle prendra le '\n' du buffer (celui qu'on vide avec getchar()). Ainsi ta variable va prendre le code ascii du retour chariot, la lettre que tu taperas sera hors buffer (donc cela écrira dans la pile) et le \0 pareil. Ainsi si tu inverses les variables les deux caractères débordant vont écrire dans l'autre structure de par l'ordre inversé de la pile. Mais si tu ne les inverses pas, cela écrira sur des informations plus gênantes pouvant entraîner un bug du programme.

Cdlt
1
nobie-cs Messages postés 155 Date d'inscription samedi 21 novembre 2009 Statut Membre Dernière intervention 15 mai 2010 17
23 nov. 2009 à 19:37
tu met sa "Remplir_joueur(&joueur2,&joueur1);" est sa marche :( et je sait pas pourquoi
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
23 nov. 2009 à 23:33
Bah car c'est correct ;-))).
0
C bien ettonnant... Qqn aurait une explication?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Wahou merci beaucoup pour vos reponses! Je vois que j'ai encore beaucoup a apprendre, mais je tiens a signaler que je n'ai que 2 mois de programmation derriere moi, donc les getchar, et autres segfault, c'est du vocabulaire inconnu pour moi!

Cependant, j'ai essayé de remplacer les scanf("%s",&(*player1).marque) par des Scanf("%c",&(*player1).marque);
Mais il lors de l'execution, apres avoir demandé le nom du joueur 1, il zap carrément de me demander la marque du joueur 1 (c'est d'ailleurs ce qui m'avait fait renoncer a l'utilisation du %c si mes souvenirs sont bon)
Est-ce la qu'intervient le getchar() ? A quoi sert-il et comment s'en sert on ?

Derniere question pour etre sur de bien comprendre, meme si le probleme est resolu : pourquoi, avant la modification des %s en %c le sous programme fonctionnait il lorsqu'on inversait les variables d'entrées?? Ca parrait tellement illogique!

En tout cas, merci de vos reponses, ca fait plaisie d'obtenir de l'aide aussi rapidement!
0
Okaaay! Bah tout est clair je crois, merci beaucoup pour ton aide, elle m'a été tres utile!

Merci a tous, a bientot!
0