faire un menu implantable en C

faire un menu implantable en C - C - Programmation

Marsh Posté le 30-03-2005 à 12:43:53    

     Bonjour à tous. Je dois, dans un programme en C, réaliser un menu. J'ai choisi la solution du demander un nombre à l'utilisateur qui correspond à un choix du menu qu'on a affiché precedemment. Le problème c'est que la variable choix mise en tant que int fait planté le prog quand on fait scanf("%d",&choix); si on entre 0.5 par exemple.
      Pour m'en sortir j'ai mis choix en float et ensuite pour le test switch (pour tester le choix de l'utilisateur) j'ai mis switch((int)choix) pour forcer à passer en entier ( pke on peut pas faire un switch sur un float ). donc la sa marche si l'utilisateur entre 0.5, mais pas du tout si l'utilisateur entre la lettre a par exemple.  
 
      Est-ce qu'il existe une solution simple, compact pour avoir un menu qui ne plante pas si l'utilisateur se tape un delire dessus. Je demande pas le code tout fait, mais juste une piste ou une technique.
 
      merci
 
 

Code :
  1. void menu(void)
  2. {
  3. float choix;
  4. system("cls" );
  5. printf("Menu : entrez le code correspondant a l'action souhaitee :\n\n\t1 -\tparametrages\n\t2 -\treinitialiser\n\t3 -\tsimulation manuelle\n\t4 -\tsimulation automatique\n\t5 -\tquitter\n" );
  6. do
  7. {
  8.  scanf("%f",&choix);
  9. } while(!((choix==1)||(choix==2)||(choix==3)||(choix==4)||(choix==5)));
  10. switch((int)choix)
  11. {
  12. case 1:
  13.  break;
  14. case 2:
  15.  break;
  16. case 3:
  17.  break;
  18. case 4:
  19.  break;
  20. case 5:
  21.  quitter();
  22.  break;
  23. default:
  24.  break;
  25. }
  26. printf("\n%f",choix);
  27. printf("\n%d",(int)choix);
  28. }

Reply

Marsh Posté le 30-03-2005 à 12:43:53   

Reply

Marsh Posté le 30-03-2005 à 15:35:15    

elessar53 a écrit :

Bonjour à tous. Je dois, dans un programme en C, réaliser un menu.<...> scanf("%d",&choix);
<...>  
      Est-ce qu'il existe une solution simple, compact pour avoir un menu qui ne plante pas si l'utilisateur se tape un delire dessus.


La solution robuste a été exposée 10.000 fois... Utiliser fgets()...
 
http://mapage.noos.fr/emdel/notes.htm#saisie


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 30-03-2005 à 15:54:40    

Bonjour, (dsl d'empiéter sur ton poste elessar53 mais bon j'allais pas recréer un sujet similaire )
J'ai pas de soucis pour toute les touches alphanumériques mais par contre pour les touches spécifiques je bloque :
 
Avec un simple getch() j'arrive bien à récuperer la saisie de ESC puis celle des touches alphanumériques mais pas les touche F1 F2 F3 ... Fx
 
Avec un bioskey(0) cela récupere la saisie des touches Fx mais plus toutes les autres...
 
 
et dans mon menu je propose les touches F1 F2 F3...  ESC et d'autre touches
 

Code :
  1. #define     KEY_ESC        0x001B
  2. #define     KEY_BS         0x0008
  3. #define     KEY_TAB        0x0009
  4. #define     KEY_CR         0x000D
  5. #define     KEY_SPACE      0x0020
  6. #define     KEY_F1         0x3B00
  7. #define     KEY_F2         0x3C00
  8. #define     KEY_F3         0x3D00


 
avec la méthode http://mapage.noos.fr/emdel/notes.htm#saisie peut on gérer les touches spécifiques ?
 
désolé si ma question est redondante  :jap:


Message édité par gaar@ le 30-03-2005 à 15:56:04
Reply

Marsh Posté le 30-03-2005 à 16:12:39    

gaar@ a écrit :

avec la méthode http://mapage.noos.fr/emdel/notes.htm#saisie peut on gérer les touches spécifiques ?


Non. Mon code est purement standard, Il ne voit que des caractères en provenance de stdin, pas des touches. Pour les touches, il faut des extensions qui dépendent du système et du compilateur.
 
La méthode classique sous MS-DOS/Borland C est


#include <conio.h>
 
int c = getch();
 
   if (c == 0)
   {  
      if (kbhit())
      {
         c = getch();
         /* c = touche etendue (F1-F10, fleches etc.) */
      }
   }
   else
   {
      /* c = touche alpha numerique */
   }


Evidemment, ce n'est pas portable...


Message édité par Emmanuel Delahaye le 30-03-2005 à 16:16:16

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 30-03-2005 à 18:17:25    

Merci Emmanuel mais j'arrive franchement pas à utiliser fgets() pour recuperer une seule valeur. y'a 3 arguments à fournir à la fonction. qu'est ce qu'il faut ecrire pour mettre un nombre dans la variable choix sans que sa plante ??? fgets(choix) marche po :-(

Reply

Marsh Posté le 30-03-2005 à 19:42:04    

fgets te permet de lire une chaine qui a ete saisie, pas un float directement. Le premier argument est l'adresse du buffer ou la chaine lue sera ecrite. Le deuxieme est la taille du buffer, qui permettra a fgets de ne pas deborder. Le dernier argument est le flot sur lequel tu veux lire l'entree (stdin dans ton cas).

Reply

Marsh Posté le 31-03-2005 à 10:50:06    

elessar53 a écrit :

Merci Emmanuel mais j'arrive franchement pas à utiliser fgets() pour recuperer une seule valeur. y'a 3 arguments à fournir à la fonction. qu'est ce qu'il faut ecrire pour mettre un nombre dans la variable choix sans que sa plante ??? fgets(choix) marche po :-(


J'ai donnée des exemples sur mon site...
 
Montre ton code.
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 31-03-2005 à 11:22:00    

Citation :

Le premier argument est l'adresse du buffer ou la chaine lue sera ecrite. Le deuxieme est la taille du buffer, qui permettra a fgets de ne pas deborder. Le dernier argument est le flot sur lequel tu veux lire l'entree (stdin dans ton cas).


donc si je mets fgets(&choix,??,stdin); sa devrai marcher. La taille elle est à mettre en octet, en bits ? que represente stdin ?
 
Emmanuel >> le code est dans le premier message

Reply

Marsh Posté le 31-03-2005 à 12:04:30    

elessar53 a écrit :

Citation :

Le premier argument est l'adresse du buffer ou la chaine lue sera ecrite. Le deuxieme est la taille du buffer, qui permettra a fgets de ne pas deborder. Le dernier argument est le flot sur lequel tu veux lire l'entree (stdin dans ton cas).


donc si je mets fgets(&choix,??,stdin); sa devrai marcher. La taille elle est à mettre en octet, en bits ? que represente stdin ?
 
Emmanuel >> le code est dans le premier message


  • Qu'est-ce que tu n'as pas compris dans la réponse de Matafan ?  
  • As-tu fais des essais ? Montre ton code.  
  • As-tu déjà ouvert un livre de C. Si non, fait le, si oui, recommence.
  • As-tu lu mon site ?  
  • Dans ton code initial, il n'y a pas de fgets().
  • 'choix' est-il bien un tableau de char de taille 3 au minimum ?
  • Le deuxième paramètre est-il bien la taille du tableau 'choix' (sizeof choix) ?
  • Le troisième paramètre est-il bien stdin (puisque tu veux lire à partir de l'entrée standard à la quelle ton clavier est probablement connecté).
  • Montre ton code (j'enfonce le clou...)
  • As-tu pensé à agiter ton neurone avant de t'en servir (sinon les idées, elles restent au fond...) ?


Message édité par Emmanuel Delahaye le 31-03-2005 à 12:05:11

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed