Langage C : sous programme, type stucturé...
matthymatt
-
matthymatt -
matthymatt -
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");
}
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
#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:
- Langage C : sous programme, type stucturé...
- Langage ascii - Guide
- Langage binaire - Guide
- Pascal langage - Télécharger - Édition & Programmation
- Langage visual basic - Télécharger - Langages
- Langage basic gratuit - Télécharger - Édition & Programmation
6 réponses
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
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
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
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
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!
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!
pourquoi Remplir_joueur(&joueur2,&joueur1); a marche mais pas Remplir_joueur(&joueur1,&joueur2);
Les deux marchent ! Et heureusement ^^.
si tu met " (&joueur1,&joueur2);" le programme affiche :
>> a
nomjoueur2 >>b
si tu met " (&joueur2,&joueur1);" le programme affiche :
nomjoueur1 >> a
nomjoueur2 >> b
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