Partage
  • Partager sur Facebook
  • Partager sur Twitter

Quitter un programme avec la touche [Echap] ?

Sujet résolu
    10 juin 2024 à 19:10:52

    Bonjour à tous,

    Je voudrais savoir s'il existe la possibilité de quitter un programme en appuyant sur la touche [Echap].

    Voici mon programme :

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, const char argv[])
    {
        char reponse=0;
        int n = 0;
    
        while (reponse != 27) {
            printf("1. Lire le catalogue.\n");
            printf("2. Inscrire un document\n");
            printf("3. etc.\n");
            printf("\nVotre choix [Echap pour quitter] : ");
            n=scanf_s("%c", &reponse);
            getchar();
            printf("Vous avez tape %c\n\n", reponse);
        }
    
        return 0;
    }
    



    Merci de vos réponses.

    -
    Edité par chrisblues59 10 juin 2024 à 19:14:43

    • Partager sur Facebook
    • Partager sur Twitter
      10 juin 2024 à 19:20:07

      Hello,

      Non, pas en C standard. Il y a toujours la possibilité d'utiliser kbhit() et getch() (windows only, in conio.h), mais pourquoi ne pas avoir un "0. Quitter le programme" ? C'est tellement simple à implémenter.

      Qui plus est:

      • c'est const char *argv[]
      • on évite les nombres magiques: on fait un #define ESCAPE 27 (ou #define ESCAPE 0x1b, mon préféré) et on emploie ESCAPE dans le code (ECHAP si tu préfères).

      Edit: et comme déjà écrit: lorsqu'on n'utilise pas argc et argv: int main(void)

      -
      Edité par edgarjacobs 10 juin 2024 à 19:41:44

      • 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

        10 juin 2024 à 19:43:48

        Je viens d'essayer, mais ... ! Bizarre, ça ne marche pas...

        #define _CRT_SECURE_NO_WARNINGS
        #include <stdio.h>
        #include <stdlib.h>
        
        int main(int argc, const char argv[])
        {
            char reponse=0;
            int n = 0;
        
            while (reponse != 27) {
                printf("1. Lire le catalogue.\n");
                printf("2. Inscrire un document\n");
                printf("3. etc.\n");
                printf("4. Quitter la mediatheque.\n");
        
                printf("\nVotre choix [Echap pour quitter] : ");
                scanf_s("%c", &reponse);
                getchar();
                printf("Vous avez tape %c\n\n", reponse);
        
                if (reponse == 4)
                    break;
            }
        
            return 0;
        }
        



        • Partager sur Facebook
        • Partager sur Twitter
          10 juin 2024 à 19:50:34

          Je viens d'essayer, mais ... ! Bizarre, ça ne marche pas...

          Logique. reponse est un caractère, pas un entier. Et donc, le if de la ligne 21 n'est pas correct....

          Edit: *

          _____________________________________________________________________________________

          Juste puisque je l'ai mentionné (je déconseille vivement)

          #include <conio.h>
          #include <ctype.h>
          #include <stdio.h>
          
          #define ESCAPE  0x1b
          
          int main(void) {
              char c;
              do {
                  puts("\n1. Lire le catalogue.");
                  puts("2. Inscrire un document");
                  puts("3. etc.");
                  printf("\nVotre choix [Echap pour quitter] : ");
                  while(!kbhit());
                  c=getch();
                  if(isdigit(c))
                      printf("%c\n", c);
              } while(c!=ESCAPE);
          
              return(0);
          }

          -
          Edité par edgarjacobs 10 juin 2024 à 20:22:43

          • 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

            10 juin 2024 à 22:15:40

            Oui, c'est presque ça ! L'appui sur [Echap] permet de sortir du programme, mais...

            Quand j'appuie sur 1, 2 ou 3, la redirection ne se fait pas malgré le 'switch(c)', probablement parce que 'c' est un caractère, et donc ce n'est pas un 'int'.

            Comment dois-je dénommer switch(c) ?

            Autre chose, la compilation du programme tel que je l'ai reçu, a donné deux warnings :

            J'ai donc corrigé en '_getch' et en '_kbhit', et là, le programme a fonctionné.

            Merci de ton aide.

            -
            Edité par chrisblues59 10 juin 2024 à 22:17:13

            • Partager sur Facebook
            • Partager sur Twitter
              10 juin 2024 à 23:26:42

              Faut rester logique: on compare des entiers avec des entiers, des caractères avec des caractères:

              int c;
              scanf("%d", &c);
              switch(c) {
              	case 1: ....
              	case 2: ....
              	etc....
              }
              char c;
              scanf("%c", &c);
              switch(c) {
              	case '1': ....
              	case '2': ....
              	etc....
              }



              -
              Edité par edgarjacobs 10 juin 2024 à 23:38:39

              • 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

                11 juin 2024 à 9:47:06

                Ah, ben oui ! Effectivement, ça marche ! Merci pour ces précieuses remarques.

                J'ai une question : la ligne "while(!kbhit());"...

                Elle boucle sur elle-même ? Je ne vois pas d'accolades, genre :

                while(!kbhit());

                {

                ...

                }

                -
                Edité par chrisblues59 11 juin 2024 à 9:52:00

                • Partager sur Facebook
                • Partager sur Twitter
                  11 juin 2024 à 15:36:35

                  >Elle boucle sur elle-même ?

                  Oui. Ça peut aussi s'écrire while(!kbhit()) {}

                  Edit: si tu veux mettre du code inline comme je l'ai fait, tu cliques sur html et tu entoures le code des balises <code>  </code>

                  -
                  Edité par edgarjacobs 11 juin 2024 à 16:34:35

                  • 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

                    11 juin 2024 à 17:29:31

                    J'ai compris... Merci encore.

                    Et pour le "code inline", tu veux dire en lettres rouges sur fond blanc ?

                    J'essaie  maintenant...

                    <code>while(!kbhit()) {}</code>


                    Non, c'est pas ça ! 

                    Comme ça, alors ?

                    <code>while(!kbhit()) {}</code>

                    Non plus... Où faut-il appuyer sur HTML ?

                    -
                    Edité par chrisblues59 11 juin 2024 à 17:32:45

                    • Partager sur Facebook
                    • Partager sur Twitter
                      11 juin 2024 à 18:16:48

                      >Et pour le "code inline", tu veux dire en lettres rouges sur fond blanc ?  oui

                       Deux images plutôt qu'un long discours:

                      Ce que je fais, c'est taper l'ensemble du texte, puis je passe dans l'éditeur html pour mettre les balises.

                      -
                      Edité par edgarjacobs 11 juin 2024 à 18:52:26

                      • 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

                        11 juin 2024 à 19:55:14

                        J'essaie... Voici des mots en code inline

                        Ok, okaaayyy ! Merci beaucoup.

                        -
                        Edité par chrisblues59 11 juin 2024 à 19:56:27

                        • Partager sur Facebook
                        • Partager sur Twitter
                          11 juin 2024 à 20:31:11




                          De rien

                          -
                          Edité par edgarjacobs 11 juin 2024 à 20:37:22

                          • 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

                            12 juin 2024 à 19:04:17

                            Hello edgarjacob,

                            Je crois avoir fait une constatation intéressante sur la sortie d'un programme avec [Echap] (mais je reste prudent...).

                            J'ai remarqué que l'appui sur la touche [Echap] pour sortir d'un programme est opérationnel si 'choix' est déclaré comme 'char' : ça ne fonctionne pas si 'choix' est déclaré 'int'.

                            /* Dans cet exemple, le programme affiche un menu à l’écran en utilisant la fonction “printf”
                            de la bibliothèque standard de C. Pour lire le choix de l’utilisateur, la fonction “_getch”
                            de la bibliothèque “conio.h” est utilisée pour lire le caractère appuyé sur le clavier sans
                            avoir besoin d’appuyer sur la touche “Entrée”. La valeur lue est ensuite convertie en entier
                            et enregistrée dans la variable “choix“. Le programme continue d’afficher le menu jusqu’à ce
                            que l’utilisateur choisisse l’option [Echap] pour quitter le programme. */
                            
                            #define _CRT_SECURE_NO_WARNINGS
                            #include <stdio.h>
                            #include <stdlib.h>
                            #include <conio.h>
                            
                            int main()
                            {
                                char choix;
                                do
                                {
                                    printf("Menu\n");
                                    printf("1. Option 1\n");
                                    printf("2. Option 2\n");
                                    printf("3. Option 3\n");
                                    choix = _getch();
                             
                                    printf("Vous avez appuye sur la touche %c.\n\n", choix);
                                } while (choix != 27);
                            
                                return 0;
                            }
                            

                            Voilà ! Je voulais partager ça avec toi (et avec tous ceux que ça intéresse, bien sûr...), si cela se confirme.

                            -
                            Edité par chrisblues59 12 juin 2024 à 19:07:49

                            • Partager sur Facebook
                            • Partager sur Twitter
                              12 juin 2024 à 19:16:07

                              Le caractère escape n'est pas "imprimable". C'est le début d'une séquence interprétée par le terminal pour afficher quelque chose ensuite (la séquence esc point, ça fait quelque chose ?)

                              Pour comprendre ce qui se passe, fais afficher la valeur numérique de choix

                              printf("code caractère = %d\n", choix);
                              

                              ou mieux

                              if (isprint(choix)) {
                                 printf("touche '%c'\n",         choix);
                              } else {
                                 printf("code caractère = %d\n", choix);
                              } 

                              ou encore (c'est la fête)

                              printf(isprint(choix) 
                                       ? "touche '%c'\n" 
                                       : "code caractère = %d\n",
                                     choix);
                              

                              inclure <ctype.h>


                              -
                              Edité par michelbillaud 12 juin 2024 à 19:23:40

                              • Partager sur Facebook
                              • Partager sur Twitter
                                12 juin 2024 à 19:32:58

                                Hello chrisblues59,

                                Je ne constate pas de différence entre char et int pour sortir par escape. Ce code fonctionne

                                    int c;
                                    do {
                                        puts("\n1. Lire le catalogue");
                                        puts("2. Inscrire un document");
                                        puts("3. etc");
                                        printf("\nVotre choix [Echap pour quitter] : ");
                                        c=_getch();
                                        if(c==0)
                                            getch();
                                        else
                                            if(isalnum(c))
                                                printf("%c\n", c);
                                    } while(c!=ESCAPE);
                                

                                Mais il y a quand même un piège: appuie sur une touche "spéciale", genre F1 ou insert. Et là, je ne sais plus comment on peut s'en sortir. Dans certain cas, cette modification suffit

                                        c=_getch();
                                        if(c==0)
                                            _getch();
                                        else
                                            if(isalnum(c))
                                                printf("%c\n", c);
                                

                                mais ça ne règle pas tous les problèmes. p.ex. ça fonctionne pour F1..F10 mais pas pour F11..F12 ni les insert et compagnies.

                                -
                                Edité par edgarjacobs 12 juin 2024 à 19:36: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

                                  12 juin 2024 à 20:09:31

                                  > Mais il y a quand même un piège: appuie sur une touche "spéciale", genre F1 ou insert. Et là, je ne sais plus comment on peut s'en sortir.

                                  Confier le décodage des séquences envoyées par le clavier à une bibliothèque qui sait faire (curses "wide" ?)

                                  https://docs.oracle.com/cd/E88353_01/html/E37849/wgetwch-3curses.html

                                  (jusqu'à 64 touches de fonction :-))

                                  -
                                  Edité par michelbillaud 12 juin 2024 à 20:10:41

                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  Quitter un programme avec la touche [Echap] ?

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