Partage
  • Partager sur Facebook
  • Partager sur Twitter

Un printf qui s'affiche deux fois

Deuxième TD: le pendu

    13 janvier 2021 à 18:14:19

    Bonjour le brave peuple.
    Je suis en ce moment en train de butter sur le codage du deuxième programme, celui du Pendu. Dans une boucle que j'ai conçu afin de "sécuriser" un scanf, j'ai également inclus un printf transmettant mes instructions à l'utilisateur. L'intérêt de la boucle est de "piéger" l'utilisateur malicieux qui serait tenté d'indiquer un caractère dans le programme qui ne soit pas une lettre dans le but de saboter le programme jusqu'à ce qu'il indique une lettre. Le problème, c'est que lorsque j'indique un caractère non-alphabétique pour vérifier l'efficacité du système, il "print" deux fois la ligne à renvoyer. Ca fait pas propre, et ça ne me plaît pas. Ci-joint la partie du code concernée. Merci d'avance pour votre aide.

    while (isalpha(lettreIndice) == 0)
        {
            printf("Veuillez indiquer une lettre de votre choix:\n");
            scanf("%c", &lettreIndice);
        }



    • Partager sur Facebook
    • Partager sur Twitter
      13 janvier 2021 à 18:49:36

      Tu oublies le caractère de fin de ligne (Enter ou '\n'). Essaies le format "%c " avec un espace après le %c.
      Tu peux aussi mettre un fflush(stdin) après le scanf() pour l'effacer (flush du buffer)
      • Partager sur Facebook
      • Partager sur Twitter

      Le Tout est souvent plus grand que la somme de ses parties.

        13 janvier 2021 à 19:00:51

        PierrotLeFou a écrit:

        Essaies le format "%c " avec un espace après le %c.

        Avant le %c !

        • Partager sur Facebook
        • Partager sur Twitter
          13 janvier 2021 à 19:04:02

          ça a marché, je vous remercie. Puis-je savoir les détails techniques de cette correction?
          • Partager sur Facebook
          • Partager sur Twitter
            14 janvier 2021 à 1:50:50

            Merci rouloude pour la précision.
            L'espace force la lecture de tout caractère dit "white space" comme Espace, Tab, Return et Enter.
            Return = Carriage Return = '\r'
            Enter = Newline = '\n'
            • Partager sur Facebook
            • Partager sur Twitter

            Le Tout est souvent plus grand que la somme de ses parties.

              14 janvier 2021 à 9:13:33

              Le seul moyen de sécuriser scanf pour l'entrée utilisateur est de ne pas l'utiliser. Cette fonction est faite pour lire une entrée correctement formattée ce qui n'est pas le cas de l'utilisateur.

              Utilise fgets pour lire une ligne correctement (sans avoir à vider stdin manuellement) et analyse cette ligne.

              • Partager sur Facebook
              • Partager sur Twitter
              l'azerty est aux dispositions ce que subversion est aux SCM

              Un printf qui s'affiche deux fois

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              • Editeur
              • Markdown