Scanf ne met pas en pause le programme

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour à tous !

J'ai commencé ce matin le fameux C. Et à vrai dire, je m'y plait bien pour le moment ! Voici donc le jeu du plus ou moins :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
    int usrNb, usrMin, usrMax;
    char usrRestart;
    int nbSecret, nbTry, nbPlayer;
    int restart, newTry;

    usrMin = 0;
    usrMax = 100;

    restart = 1;

    puts("Bonjour !");
    printf("Combien de joueur ? [1/2] ");
    do 
    {
        scanf("%d", &nbPlayer);

        if(nbPlayer != 1 && nbPlayer != 2)
        {
            puts("Le jeu ne peut se jouer que tout seul ou à deux. \n\
                Entrez 1 si vous voulez jouer seul ou 2 si vous voulez jouer à deux.");
        }
    } while(nbPlayer != 1 && nbPlayer != 2);


    // Nouvelle partie :
    do 
    {
        if(nbPlayer == 1) 
        {
            srand(time(NULL));
            nbSecret = (rand() % (usrMax - usrMin + 1)) + usrMin;
        }
        else 
        {
            printf("Joueur 1, entrez un nombre : ");
            scanf("%d", &nbSecret);
            puts("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\
                \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\
                \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
            puts("Joueur 2, à vous !");
        }

        nbTry = 0;

        do 
        {   
            printf("Entrez un nombre compris entre %d et %d : ", usrMin, usrMax);
            scanf("%d", &usrNb);

            if(usrNb > nbSecret) 
            {
                puts("Plus petit !");
                nbTry++;
            }
            else
            {
                puts("Plus grand !");
                nbTry++;
            }
        } while(usrNb != nbSecret);
        printf("Bravo le nombre secret était bien %d !\n", usrNb);
        printf("Vous avez trouvé la réponse en %d coup%c\n\n", nbTry, (nbTry > 1) ? 's' : ' ');

        printf("Voulez-vous recommencer une partie ? [O/n] ");
        scanf("%c", &usrRestart);

        restart = (usrRestart == 'o' || usrRestart == 'O') ? 1 : 0;
    } while(restart);

    puts("\n\nAu revoir !");
    return 0;
}

Ce qui me pose problème, c'est les lignes 71 et 72 :

1
2
printf("Voulez-vous recommencer une partie ? [O/n] ");
scanf("%c", &usrRestart);

Ici, le programme ne s'arrête pas et donc ne me demande pas si je veux recommencer une partie… Pourriez-vous m'expliquer pourquoi ?
Merci beaucoup !

Édité par Wizix

Mon projet : OpenPlane, un utilitaire en Java pour les pilotes, les vrais !

+0 -0

Cette réponse a aidé l'auteur du sujet

Je parie sur le fait que tu as des éléments dans ton buffer d'entrée. Pour faire simple, quand tu fais un scanf, il lit et stocke tout ce qui a été tapé au clavier jusqu'au \n de la touche entrée. Seulement, s'il utilise les caractères précédents comme les nombre, il laisse le \n dans le tampon d'entrée. Résultat à la fin de la partie, tu demandes un caractère mais il est déjà là le \n qu'il avait laissé donc il va le prendre sans demander de ta part de taper d'autres caractères.

Pour y remédier, il faut vider le tampon. Tu as des tas de petits codes sur Internet qui le font très bien, je t'invite à chercher. :) Tu peux aussi voir d'autres fonctions que scanf pour réaliser cette tâche comme fgets qui ont l'avantage de ne pas présenter ce défaut. Si tu as un niveau en C suffisant je te recommande vivement cette possibilité.

Édité par Renault

Amateur de Logiciel Libre et de la distribution GNU/Linux Fedora.

+1 -0
Auteur du sujet

Ah d'accord ! Je commence vraiment le tuto et cette notion n'est pas abordé (ou alors je lit très mal..). Voici la fonction que j'utilise donc :

1
2
3
4
5
6
7
8
void clearBuffer() 
{
    int c;
    do 
    {
        c = getchar();
    } while (c != EOF && c != '\n');
}

Merci beaucoup de ton aide!

Mon projet : OpenPlane, un utilitaire en Java pour les pilotes, les vrais !

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte