#26 Le 29/04/2021, à 08:00
- Amiralgaby
Re : Comment débuguer un programme exemple le pendu
J'ai appris ça durant ma formation en DUT informatique et de ce que je m'en rappelle ça vide le buffer du caractère '\n' que tu as mis.
Dans ton jeu quand tu as la question et que tu met la lettre choisi (par exemple 'A') puis appui sur la touche entrée, ça écrit '\n' dans le buffer de stdin .
Avec l'exemple ça donne 'A\n'.
avec cette technique on enlève le '\n', donc il ne va pas reprendre la main puisque avant le programme voyait directement '\n' et garde vide ta variable.
Vive la communauté du Libre !!!
Hors ligne
#27 Le 29/04/2021, à 11:07
- zephyre123
Re : Comment débuguer un programme exemple le pendu
Non l'entrée "n'est pas coupé".
Si tu tapes "abc" + Entrée, il y aura 4 caractères dans l'entrée standard. scanf va lire ces 4 caractères les uns après les autres.
Et donc dans mon programme c'est ça qui fou la merde si je comprends bien.
1- on tape une lettre = exemple 'A' + [ENTER] => scanf lis la lettre 'A' et [ENTER] se balade je sais pas ou dans la mémoire
2- scanf("%c", &lettre_utilisateur) scanf récupère la lettre utilisateur dans un pointeur
Au prochain passage de la boucle do while :
- 1 scanf à toujours en mémoire la touche [ENTER] précédente
- 2 et c'est cela qui provoque l'erreur du programme et me retire une vie car le caractère [ENTER] n'est pas présent dans le mot secret
C'est bien cela qui se passe et c'est pour ça que mon programme précédent déconnait ?
Mais je ne vois toujours pas ce que fait cette ligne :
- scanf("%*c")
Je pense mais je n'en suis pas certains que ça libère le pointeur du coup il ne pointe plus vers le caractère [ENTER] ?
C'est bien cela ?
@Amiralgaby : avec cette technique on enlève le '\n', donc il ne va pas reprendre la main puisque avant le programme voyait directement '\n' et garde vide ta variable.
Mais on tu as lu cela y a rien de tout cela dans le man ?
An optional '*' assignment-suppression character: scanf() reads input as directed by
the conversion specification, but discards the input. No corresponding pointer
argument is required, and this specification is not included in the count of suc‐
cessful assignments returned by scanf().
Ou alors c'est assignement-suppression character => assigne/affecte et en même temps supprime le caractère = ça veut rien dire ?
Vraiment de la merde l'anglais comme langue !
Déja pour pondre une langue qui ne s'écrit pas comme ça se prononce faut vraiment être MASO !
Dernière modification par zephyre123 (Le 29/04/2021, à 11:29)
Hors ligne
#28 Le 29/04/2021, à 11:39
- grigouille
Re : Comment débuguer un programme exemple le pendu
C'est tiré du "man scanf"
Debian (xfce) 12
HP LaserJet M1132 MFP
Hors ligne
#29 Le 29/04/2021, à 11:46
- zephyre123
Re : Comment débuguer un programme exemple le pendu
Mais il est incompréhensible ton man scanf !
assignement-suppression character => on supprime ou on assigne le caractère ! On peut pas faire les deux en même temps !
Dernière modification par zephyre123 (Le 29/04/2021, à 11:47)
Hors ligne
#30 Le 29/04/2021, à 13:41
- Amiralgaby
Re : Comment débuguer un programme exemple le pendu
Pour faire simple c'est comme si tu faisais :
scanf("%c", &caractère_entré);
mais que tu l'ignore.
ça le lit mais ça l'ignore.
What does %*c mean in C/C++ programming?
oui sur l'entrée standard tu met 'A' + [ENTRÉE]
scanf("%c", &lettre); lit un seul caractère
oui, [ENTRÉE] se balade dans la mémoire (buffer stdin je crois)
bien vu ! le caractère entré '\n' n'est pas dans la chaîne 'Bonjour'. donc tu perd une vie
ça ne libère pas de pointeur car tu ne dois pas libérer un caractère dans la pile (sinon programme foutu).
je vais me répéter : ça lit le buffer stdin où il y a le caractère entré qui attend gentiment.
scanf("%c", &lettre); veux un caractère dans l'entrée standard, il voit '\n' et paf ! dans ta variable.
Bonne journée
Vive la communauté du Libre !!!
Hors ligne
#31 Le 29/04/2021, à 15:09
- pingouinux
Re : Comment débuguer un programme exemple le pendu
Bonjour,
Vraiment de la merde l'anglais comme langue !
Déja pour pondre une langue qui ne s'écrit pas comme ça se prononce faut vraiment être MASO !
[HS]Et en français :
Les poules du couvent couvent.[/HS]
Hors ligne
#32 Le 29/04/2021, à 16:49
- Pascaltech
Re : Comment débuguer un programme exemple le pendu
Bonjour,
Tu peux entrer un mouchard dans la boucle do de ton code afin de mieux voir ce qui se passe : printf("lettre=%c\n", lettre_utilisateur);
Le C en 20 heures
do
{
// Lire la donnée utilisateur
// ==========================================================================
printf("Entrer une lettre majuscule ou minuscule ?\n");
fflush(stdin);
scanf("%c", &lettre_utilisateur);
// ==========================================================================
printf("lettre=%c\n", lettre_utilisateur);
// Vérification de la saisie utilisateur
// ==========================================================================
bool presence_lettre = false;
for (int i = 0; i < taille; i++)
{
if (mot_secret[i] == lettre_utilisateur)
{
presence_lettre = true;
mot_rentrer_par_utilisateur[i] = lettre_utilisateur;
}
}
// ==========================================================================
// Affichage en fonction de la présence de la lettre
// ==========================================================================
if (presence_lettre == true)
printf("Votre lettre : %c est bien présente dans le mot : \"%s\"\n", lettre_utilisateur, mot_rentrer_par_utilisateur);
else
{
nombre_vie--;
printf("Votre lettre n'est pas présente, il vous reste %d vie\n", nombre_vie);
}
// ==========================================================================
// Test de la victoire
// ==========================================================================
if (strcmp(mot_secret, mot_rentrer_par_utilisateur) == 0)
{
printf("vous avez trouvé le mot : \"%s\"", mot_secret);
break;
}
// ==========================================================================
} while (nombre_vie > 0);
ce qui donne comme exécution :
Entrer une lettre majuscule ou minuscule ?
j
lettre=j
Votre lettre : j est bien présente dans le mot : "___j___"
Entrer une lettre majuscule ou minuscule ?
lettre=
Votre lettre n'est pas présente, il vous reste 9 vie
Entrer une lettre majuscule ou minuscule ?
b
lettre=b
Votre lettre n'est pas présente, il vous reste 8 vie
Entrer une lettre majuscule ou minuscule ?
lettre=
Votre lettre n'est pas présente, il vous reste 7 vie
Entrer une lettre majuscule ou minuscule ?
B
lettre=B
Votre lettre : B est bien présente dans le mot : "B__j___"
Entrer une lettre majuscule ou minuscule ?
lettre=
Votre lettre n'est pas présente, il vous reste 6 vie
Entrer une lettre majuscule ou minuscule ?
O
lettre=O
Votre lettre n'est pas présente, il vous reste 5 vie
Entrer une lettre majuscule ou minuscule ?
lettre=
Votre lettre n'est pas présente, il vous reste 4 vie
Entrer une lettre majuscule ou minuscule ?
o
lettre=o
Votre lettre : o est bien présente dans le mot : "Bo_jo__"
Entrer une lettre majuscule ou minuscule ?
lettre=
Votre lettre n'est pas présente, il vous reste 3 vie
Entrer une lettre majuscule ou minuscule ?
Ce qui te permets de voir qu'il y a deux entrée : la lettre et un vide.
La lettre b ne fonctionne pas car elle est en minuscule.
La fonction scanf("%*c"); efface toute nouvelle entrée suivant la première : scanf("%c", &lettre_utilisateur);
Sinon, je ne vois l'intérêt de jouer à un jeu dont on connaît le mot secret.
Emachine el1200, Xubuntu 20.04 LTS
Traductions guides serveur & grub et liens utiles Classement CG
inxi -F sudo lshw dpkg -l
Hors ligne
#33 Le 29/04/2021, à 17:18
- zephyre123
Re : Comment débuguer un programme exemple le pendu
Ok j'ai tout compris merci pour vos explications et votre patience.
Et @pinguinux je persiste et signe l’anglais c'est vraiment de la merde !
@Pascal tech merci pour le tuyau du debuggage sur ton lien le C en 20h
Hors ligne
#34 Le 29/04/2021, à 17:26
- Pascaltech
Re : Comment débuguer un programme exemple le pendu
An optional '*' assignment-suppression character:
scanf() reads input as directed by the conversion specification, but discards the input.
No corresponding pointer argument is required, and this specification is not included
in the count of successful assignments returned by scanf().
Un caractère facultatif de suppression d'affectation '*' :
scanf() lit l'entrée comme indiqué par la spécification de conversion, mais rejette l'entrée.
Aucun argument pointeur correspondant n'est requis, et cette spécification n'est pas incluse
dans le compte des affectations réussies retournées par scanf().
La page de téléchargement du man : Support_programmation_c
Emachine el1200, Xubuntu 20.04 LTS
Traductions guides serveur & grub et liens utiles Classement CG
inxi -F sudo lshw dpkg -l
Hors ligne