Partage
  • Partager sur Facebook
  • Partager sur Twitter

Le TP1 et l'utilisateur idiot

ça fait planter le programme

    22 décembre 2005 à 1:03:54

    Bonsoir

    Tout d'abord merci M@teo21 pour les cours C/C++ et surtout le TP qui donne plein d'idées de programmes et d'appliations des cours :)

    Mais voilà il est souvent dit qu'il faut penser à TOUTES les situations possibles et imaginables MAIS (sauf erreur de ma part) il y a dans le TP lui même une option à laquelle M@teo n'as pas pensé ou bien qu'il a préféré mettre de côter car trop compliqué pour la 1er partie.

    C'est tout simple, penssez qu'un gars dérape sur le clavier (ou qu'il soit idiot et confonde les chiffres et les lettres) et rentre une lettre au lieu d'un chiffre dans le jeu. Que ce passe t'il ? Eh bien le programme plante !

    Quelle est la solution pour éviter ceci s'il vous plaît ?

    Et si possible, merci d'expliquer pourquoi le programme fait ce qu'il fait ! (vous me comprenez ?)

    Merci d'avance les Zér0grammeurs ;)

    • Partager sur Facebook
    • Partager sur Twitter
      22 décembre 2005 à 1:31:20

      C'est parce qu'on utilise scanf(); à mauvais essient...

      Mais c'est parce que c'est le plus facile à utiliser au début :)


      int pas_une_lettre = 0;
      char temp[20];
      char saisie[20];

      do {
          printf("Rentre un nombre : ");
          fflush(stdout);   
          fgets(saisie, sizeof saisie, stdin);
          pas_une_lettre = sscanf(saisie, "%[0-9]s", temp);
          sscanf(saisie, "%d", &nbr_entre);
      } while (pas_une_lettre != 1);


      Pourquoi fflush(stdout) :

      Le printf avant de s'afficher passe par stdout qui est un tampon de passage. Il y a trois facon pour que ce tampon affiche le texte :
      • Le tampon est plein (incontrolable)
      • le tampon est terminé par un \n
      • le fflush(stdout); est mit après le printf


      Pourquoi fgets(saisie, sizeof saisie, stdin);

      fgets(); sert à lire une ligne dans un fichier, mais ici il lit ce qui est contenu dans stdin c'est ce qui remplace le scanf.

      Pourquoi pas_une_lettre = sscanf(saisie, "%[0-9]s", temp);

      Ici, le sscanf sert à filtrer les caractère pour voir si il sont bien des chiffres (pour ceux qui on fait du php, les Expressions régulière ca vous dis quelque chose ^^ )

      Une petite comparaison pour ceux qui ne comprendrait pas vraiment ce que j'ai dit :

      Imaginez vous sur la plage, le sable chaud est à vos pieds, la mer est devant vous... (Nan, ne vous endormez pas !!!)
      Vous avez une passette à la main et vous vous dites que du beau sable fin dans votre table creuse chez vous serais des plus joli ! Vous prenez donc une poignée de sable remplit de branchette et de caillou. Et vous la mettez sur la passette. Le sable sera ainsi filtrer...

      Ce n'est pas exactement le cas ici (je ne vois pas l'utiliter de sable dans la console de windows ^^) Mais cela représente un filtre pour tester la chaine rentrée !


      Vous avez aussi remarquer que l'on mettais ce sscanf dans une variable, car il retournera un 1 ou un 0 selon qu'il y aie juste des chiffres ou des caractères autres.

      Cela servira à tester dans le do ... while, et tant que l'utilisateur ne rentre pas de chiffre, il revera la meme phrase qui lui redemande de l'introduire.

      Pourquoi sscanf(saisie, "%d", &nbr_entre);

      Voici ici, que notre sscanf réaparait mais à quoi il sert ici, il sert tout simplement à passer d'un char vers un int, j'aurais pus passé d'un char vers un long ou vers un double, mais j'imagine du moment qu'il ne contient qu'exclusivement des chiffres ! ( a != int )


      Voilà je pense que j'ai fait le tour de ce petit morceau de code.
      J'ai surement pas fait ca aussi bien que certain l'aurais fait, je voulais juste ne pas lacher un code tout bêtement : /

      Si j'ai fait de grosse grosse faute, dites le moi :)
      • Partager sur Facebook
      • Partager sur Twitter
        22 décembre 2005 à 7:55:39

        Tu peux remplacer tes deux sscanf par un seul strtol, qui sera plus économique et plus joli ou un seul sscanf avec un format %d et en checkant le retour de la même manière.
        • Partager sur Facebook
        • Partager sur Twitter

        Le TP1 et l'utilisateur idiot

        × 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