Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème de boucle infinie

Boucle infinie

    8 juin 2023 à 19:22:21

    Bonjour les amis . J'ai un petit soucis , vous m'enverrez ravi si vous m'aider à le resoudre . Dans le programme si dessous , je veux pas qu'autre valeur que 1 et 2 soit valable pour "mode" mais quand je mets des valeurs flottantes(comme 1.5 ou 2.8) , ça les accepte
    et si jamais je mets un caractere comme un point par exemple , ça entre dans une boucle infinie . J'aimerais comprendre svp aidez moi . Merci beaucoup !
    <pre class="brush: cpp;">
    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
       int mode = 0 ;

      do

        {
            printf(" Mode 1 ou 2 ? \n");
            scanf("%d",&mode);
        }
        while(mode!=1 && mode!=2);
        printf( " Super" \n);
       return 0 ;
    }
    </pre>

    -
    Edité par AbdoulwadoudTidjani 8 juin 2023 à 19:55:19

    • Partager sur Facebook
    • Partager sur Twitter
      8 juin 2023 à 19:31:51

      Bonjour,

      Le message qui suit est une réponse automatique activée par un membre de l'équipe de modération. 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 Code 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.

      Manque de Politesse

      Votre message ne comporte pas ou peu de formules de politesse (« Bonjour », « Merci », « Au revoir », etc.). Les règles du site exigent que chaque nouveau message comporte un minimum de politesse. Après tout, les gens qui répondent le font gratuitement, sur leur temps libre. Ils méritent bien un minimum de considération, n'est-ce pas ?

      Liens conseillés

      • Partager sur Facebook
      • Partager sur Twitter
        8 juin 2023 à 19:55:23

        Hello,

        C'est dû au fonctionnement de scanf(). Si tu mets 1.3, comme tu as donné le format pour un entier, scanf() lit le 1, et ensuite rejette le '.' . C'est donc la valeur 1 qui est assignée à mode. Mais si tu n'entres qu'un point ('.'), scanf() le refuse et le '.' reste dans le buffer clavier, mode reste à 0, le test est faux, on revient à scanf() qui lit le '.', le refuse, etc.... d'où la boucle infinie.

        Dans un premier temps, tant que tu n'auras pas suivi un tutoriel pour faire des entrées protégées des bêtises de l'utilisateur (fgets() associé à sscanf() par exemple), entre des valeurs correctes.

        -
        Edité par edgarjacobs 8 juin 2023 à 19:57:53

        • Partager sur Facebook
        • Partager sur Twitter

        On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

          8 juin 2023 à 20:11:47

          edgarjacobs a écrit:

          Vraiment Merci beaucoup . Je comprends maintenant grâce à vous . Svp ou auriez vous un pdf ou une video qui explique les entrées 

          avec fgets() et sscanf() ? J'en demande trop . Désolé . Merci encore

          • Partager sur Facebook
          • Partager sur Twitter
            8 juin 2023 à 20:36:26

            Une recherche avec comme terme "fgets et sscanf" ?

            Edit: avec ma première réponse, je n'ai soulevé qu'un petit pan du voile des problèmes qu'on peut rencontrer avec les entrées utilisateur.

            -
            Edité par edgarjacobs 8 juin 2023 à 20:44:16

            • Partager sur Facebook
            • Partager sur Twitter

            On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

              8 juin 2023 à 22:42:59

              Une solution possible et pas trop compliquée, mais incomplète je crois, c'est d'exploiter la valeur de retour de 'scanf' : c'est le nombre d'arguments que 'scanf' a réussi à lire correctement.

              Exemple :

              int nb = scanf("%d",&mode); // nb = nbre d'arguments que 'scanf' a réussi à lire
              if (nb != 1) // c'est qu'il y a eu un problème...
                  mode = 1; // dans ce cas on met une valeur par défaut
              if ((mode != 1) && (mode != 2)) // l'utilisateur a rentré une mauvaise valeur
                  mode = 1; // là encore on force la valeur par défaut

              Je crois qu'il faut ensuite vider le tampon pour être sûr qu'il ne reste pas un caractère qui n'aurait pas été lu. Pour ça on appelle cette fonction :

              void viderTampon()
              {
                  int c = 0;
                  while (c != '\n' && c != EOF)
                      c = getchar();
              }

              -
              Edité par robun 8 juin 2023 à 22:44:40

              • Partager sur Facebook
              • Partager sur Twitter

              Problème de boucle infinie

              × 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.
              • Editeur
              • Markdown