Scanf ne met pas en pause le programme

Le problème exposé dans ce sujet a été résolu.

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 !

+0 -0

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

+1 -0

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!

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

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