A voir également:
- Langage C : sous programme, type stucturé...
- Langage ascii - Guide
- Langage binaire - Guide
- Pascal langage - Télécharger - Édition & Programmation
- Langage pascal - Télécharger - Édition & Programmation
- Dev-Pascal - Télécharger - Édition & Programmation
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
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
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
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
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
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
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
23 nov. 2009 à 19:37
tu met sa "Remplir_joueur(&joueur2,&joueur1);" est sa marche :( et je sait pas pourquoi
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
23 nov. 2009 à 23:33
Bah car c'est correct ;-))).
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!
23 nov. 2009 à 23:41
pourquoi Remplir_joueur(&joueur2,&joueur1); a marche mais pas Remplir_joueur(&joueur1,&joueur2);
24 nov. 2009 à 00:16
Les deux marchent ! Et heureusement ^^.
24 nov. 2009 à 00:18
si tu met " (&joueur1,&joueur2);" le programme affiche :
>> a
nomjoueur2 >>b
si tu met " (&joueur2,&joueur1);" le programme affiche :
nomjoueur1 >> a
nomjoueur2 >> b
24 nov. 2009 à 06:28
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