Partage
  • Partager sur Facebook
  • Partager sur Twitter

Empêcher d'entrer un autre caractère qu'un nombre

Sujet résolu
    24 décembre 2005 à 17:58:47

    do
    {
        printf("Choisissez la difficulte: ");
        scanf("%ld", &difficulte);
    } while (difficulte < 1 || difficulte > 5);

    Le problème avec ce bout de code c'est que si j'entre autre chose qu'un chiffre, le programme se lance dans une boucle infinie.

    Comment empêcher donc que l'utilisateur entre autre chose qu'un nombre?
    • Partager sur Facebook
    • Partager sur Twitter
      24 décembre 2005 à 18:05:00

      C'est tout bonnement impossible (en tout cas à notre niveau), l'astuce consiste à recueillir l'entrée de l'utilisateur dans une chaîne de caractères et d'adapter les conditions en conséquence.

      Ce que je dis est pratique parce que la variable récupérée n'est pas soumise à des calculs, mais lorsque c'est le cas, je n'ai pas encore trouvé d'astuce...
      • Partager sur Facebook
      • Partager sur Twitter
        24 décembre 2005 à 18:06:32

        Mais au début du programme donne des instruction a l'utilisateurs car il ne peut diviner quelle nombre rentrer! et d'ailleur et ne sais pas qu'il faut rentrer un nombre!
        • Partager sur Facebook
        • Partager sur Twitter
          24 décembre 2005 à 18:13:20

          Je pense qu'il l'a fait, ceci n'est qu'un bout de son programme.
          • Partager sur Facebook
          • Partager sur Twitter
            24 décembre 2005 à 18:14:01

            Citation : vicovni

            Mais au début du programme donne des instruction a l'utilisateurs car il ne peut diviner quelle nombre rentrer! et d'ailleur et ne sais pas qu'il faut rentrer un nombre!


            Oui mais ça c'est parce que ce n'est évidemment qu'un bout du code.
            • Partager sur Facebook
            • Partager sur Twitter
              24 décembre 2005 à 18:20:26

              Il faut savoir que les fonctions renvoient généralement quelque chose après leur éxécution. La fonction scanf, renvoi 0 quand aucune conversion n'a été faite alors que des caractères étaient disponibles en entrée.

              Donc :

              int lecture;
              lecture = scanf("%ld",&diificulte);
              if (lecture == 0)
                printf("Erreur");

              En faisant ça tu peux savoir si ce que l'utilisateur a rentré correspond à ce que tu voulais.
              (Evidement, à toi d'apdapter pour ton problème)
              • Partager sur Facebook
              • Partager sur Twitter
                24 décembre 2005 à 18:27:02

                Citation : thom17

                Il faut savoir que les fonctions renvoient généralement quelque chose après leur éxécution. La fonction scanf, renvoi 0 quand aucune conversion n'a été faite alors que des caractères étaient disponibles en entrée.

                Donc :


                int lecture;
                lecture = scanf("%ld",&diificulte);
                if (lecture == 0)
                  printf("Erreur");


                En faisant ça tu peux savoir si ce que l'utilisateur a rentré correspond à ce que tu voulais.
                (Evidement, à toi d'apdapter pour ton problème)


                Pour être plus précis, scanf renvoie le nombre de valeurs effectivement lus :)
                Et si jamais il ne rentre pas un nombre, tu as une boucle infini car scanf essaye de convertir toujours la meme entrée. Tu peux éviter ca en faisant :

                int value = 0;
                // déclare une chaine de 512 octets
                char buf[512];
                gets (buf);
                int retour = sscanf (buf,"%d",&value);
                if(!retour ) printf("Erreur");
                else printf("C'est bon value vaut  %d",value);


                • Partager sur Facebook
                • Partager sur Twitter
                  24 décembre 2005 à 18:28:47

                  Quelqu'un a-t-il l'équivalent avec cout et cin du C++ ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    24 décembre 2005 à 18:30:17

                    hmmm il faudrait pas mettre %ld a la place de %d ?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      24 décembre 2005 à 18:33:32

                      Merci thom17 ça marche.
                      Et c'est plus facile que ton code asmanur parce que je n'y comprend rien, mon niveau en programmation est limité aux cours du SDZ.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        24 décembre 2005 à 18:34:03

                        Ca doit faire un truc comme ca (c'est pas testé ):

                        char buf[512]
                        cin.get (buf,512);
                        if(cin.fail ())
                        cout <<"Erreur\n";
                        istringstream tampon (buf);
                        int value;
                        tampo >> value;
                        cout <<"Value vaut "<<value<<endl;

                        • Partager sur Facebook
                        • Partager sur Twitter
                          24 décembre 2005 à 18:41:52

                          Lol "Au lieu de donner un poisson au mendiant, apprends lui à pêcher !"

                          J'ai le code (qui ne marche pas...), pourrais-tu me l'expliquer stp ?
                          • Partager sur Facebook
                          • Partager sur Twitter
                            24 décembre 2005 à 18:45:53

                            euhh :lol:
                            Je pense que tu trouveras ton bonheur là :
                            Mega Cours de C++
                            Ce cours est hyper complet, mais déroutant pour le débutant :) mais je pense que tu as les bases

                            Pour l'explication :
                            cin.get demande à l'utilisateur de saisir une chaine qui est stockée dans buf.
                            et ensuite je déclare un istringstream qui agit un peu comme cin sauf que cela prend les données sur une chaine de caractère. Enfin la STL est TRES complexe dans son fonctionnement.
                            • Partager sur Facebook
                            • Partager sur Twitter
                              24 décembre 2005 à 18:50:48

                              Ok, le site est mis en favoris, je le lirai un peu plus tard car je dois me concentrer sur un autre cours de C++ pour le moment.

                              Merci bien en tout cas !
                              • Partager sur Facebook
                              • Partager sur Twitter

                              Empêcher d'entrer un autre caractère qu'un nombre

                              × 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