Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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

grigouille a écrit :

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?

  1. oui sur l'entrée standard tu met 'A' + [ENTRÉE]

  2. scanf("%c", &lettre); lit un seul caractère

  3. oui, [ENTRÉE] se balade dans la mémoire (buffer stdin je crois)

  4. bien vu ! le caractère entré '\n'  n'est pas dans la chaîne 'Bonjour'. donc tu perd une vie

  5. ça ne libère pas de pointeur car tu ne dois pas libérer un caractère dans la pile (sinon programme foutu).

  6. je vais me répéter : ça lit le buffer stdin où il y a le caractère entré qui attend gentiment.

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

zephyre123 #27 a écrit :

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


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

man scanf a écrit :

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().

man scanf a écrit :

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