Pour m'entrainer au langage C j'ai pour objectif de créer un pendu. Tout se passe bien jusqu'au moment où on entre dans la boucle infinie. Le principe est simple, l'utilisateur rentre un caractère, si ce caractère est dans la chaîne de caractères du mot à trouver alors on fait apparaitre les dit caractères, sinon on recommence. On tourne comme ça tant que le mot n'est pas découvert.
Le problème c'est que lorsque que j'entre un caractère la boucle s'exécute 2 fois, une fois avec le caractère et une fois comme si j'avais simplement appuyé sur entrer. Si je n'entre aucun caractère et que j'appuie directement sur entrer là la boucle s'exécute bien une seule fois (voir la screen jointe)
Je précise que j'ai fais des tests en dehors de mon programme avec une simple boucle while présentant un printf et un scanf et le problème était toujours présent.
Voilà j'espère que vous pourrez m'aider, bonne journée
commande de compilation : gcc main.c dictionnaire.c -o main
Le message qui suit est une réponse automatique activée par un membre de l'équipe. Les réponses automatiques leur permettent d'éviter d'avoir à répéter de nombreuses fois la même chose, ce qui leur fait gagner du temps et leur permet de s'occuper des sujets qui méritent plus d'attention. Nous sommes néanmoins ouverts et si vous avez une question ou une remarque, n'hésitez pas à contacter la personne en question par Message Privé. Pour plus d'informations, nous vous invitons à lire les règles générales du forum
Merci de colorer votre code à l'aide du bouton Code
Les forums d'Openclassrooms disposent d'une fonctionnalité permettant de colorer et mettre en forme les codes source afin de les rendre plus lisibles et faciles à manipuler par les intervenants. Pour cela, il faut utiliser le bouton de l'éditeur, choisir un des langages proposés et coller votre code dans la zone prévue. Si vous utilisez l'éditeur de messages en mode Markdown, il faut utiliser les balises <pre class="brush: cpp;">Votre code ici</pre>.
Merci de modifier votre message d'origine en fonction.
Problème classique: lorsque tu donnes une réponse à ton scanf avec "%c", tu tapes ta lettre, suivie de la touche return. scanf() lit ta lettre, tu la traites, puis tu reviens au scanf(). Mais il reste le return dans le buffer clavier, que scanf() interprète comme une entrée de ta part. D'où le fait d'avoir une "boucle vide".
Pour éviter cela, il faut vider le buffer clavier après le scanf. Un exemple
int c;
while((c=getchar())!='\n' && c!=EOF);
N'oublie pas de modifier ton post pour bien présenter le code.
Super merci ! Je ne savais pas qu'il y avait un buffer clavier qui stockait le retour charriot. Du coup lorsque l'on veut mettre un scanf pour récupérer un caractère dans une boucle while on est obligé de quitter la boucle par un break, comme dans cet exemple ?
char c;
int thingly;
do {
printf("Choisissez une lettre : ");
scanf("%c", &c);
printf("Lettre choisie : %c\n", c);
while((thingly=getchar()) != '\n' && thingly != EOF);
} while(c!='z');
ou de faire une fonction (ce qui a l'avantage de n'écrire qu'une fois le code si il y a plusieurs scanf() dans le programme)
void ClearStdin(void) { // le nom est peut être mal choisi
int c;
while((c=getchar())!='\n' && c!=EOF);
}
void f(void) {
char c;
do {
printf("Choisissez une lettre : ");
scanf("%c", &c);
printf("Lettre choisie : %c\n", c);
ClearStdin();
} while(c!='z');
}
Attention que getchar() renvoie un int, ce qui permet de tester EOF (qui vaut en général -1)
Edit
Je ne savais pas qu'il y avait un buffer clavier qui stockait le retour charriot
Le buffer clavier ne stocke pas que le retour chariot, il stocke tout ce que tu tapes, jusque et y compris le \n. C'est ensuite ton programme qui le vide à son rythme. Essaie ce qui suit, et tape par exemple 123456[enter]
#include <ctype.h>
#include <stdio.h>
int main(void) {
char play_again;
do {
printf("Voulez-vous rejouer ? (O ou N) ");
scanf("%c",&play_again);
play_again=toupper(play_again);
printf("%c\n",play_again);
} while(play_again!='O' && play_again!='N');
return(0);
}
- Edité par edgarjacobs 15 août 2021 à 15:36:20
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
D'accord je vois, je comprends mieux d'où venait mon problème. Merci pour ces explications
Boucle while qui se répète anormalement 2 fois
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent