104 votes

Comment simuler "Appuyez sur n'importe quelle touche pour continuer ?"

Je suis en train d'essayer d'écrire un programme C++ dans lequel lorsque l'utilisateur entre un caractère depuis le clavier, cela devrait passer à la ligne suivante du code.

Voici mon code :

char c;

cin>>c;

cout<<"Quelque chose"<

`

mais cela ne fonctionne pas, car il ne passe à la ligne suivante que lorsque j'entre un caractère puis appuie sur ENTRÉE.

OU

Si j'utilise cela

cin.get() ou cin.get(c)

cela passe à la ligne suivante de l'instruction lorsque j'appuie sur ENTRÉE.

Mais je voulais que cela passe à la ligne suivante lorsqu'une touche est pressée sur le clavier, comment cela peut-il être fait ?

`

78voto

Sous Windows :

system("pause");

et sur Mac et Linux :

system("read");

affichera "Appuyez sur n'importe quelle touche pour continuer..." et bien évidemment, attendra qu'une touche soit pressée. J'espère que c'est ce que vous vouliez dire

58voto

Vinay Sajip Points 41286

Si vous êtes sur Windows, vous pouvez utiliser _kbhit() qui fait partie de la bibliothèque d'exécution Microsoft. Si vous êtes sur Linux, vous pouvez l'implémenter. Cité ici, voici le code :

#include 
#include 
#include 
#include 

int kbhit(void)
{
  struct termios oldt, newt;
  int ch;
  int oldf;

  tcgetattr(STDIN_FILENO, &oldt);
  newt = oldt;
  newt.c_lflag &= ~(ICANON | ECHO);
  tcsetattr(STDIN_FILENO, TCSANOW, &newt);
  oldf = fcntl(STDIN_FILENO, F_GETFL, 0);
  fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK);

  ch = getchar();

  tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
  fcntl(STDIN_FILENO, F_SETFL, oldf);

  if(ch != EOF)
  {
    ungetc(ch, stdin);
    return 1;
  }

  return 0;
}

Mise à jour : La fonction ci-dessus fonctionne sur OS X (au moins, sur OS X 10.5.8 - Leopard, donc je m'attends à ce qu'elle fonctionne sur des versions plus récentes d'OS X). Ce gist peut être enregistré sous le nom kbhit.c et compilé à la fois sur Linux et sur OS X avec

gcc -o kbhit kbhit.c

Lorsque vous exécutez avec

./kbhit

Il vous invite à appuyer sur une touche, et se termine lorsque vous appuyez sur une touche (pas limité à Entrée ou touches imprimables).

@Johnsyweb - veuillez préciser ce que vous entendez par "réponse canonique détaillée" et "toutes les préoccupations". De plus, concernant "multiplateforme" : avec cette implémentation de kbhit(), vous pouvez avoir la même fonctionnalité dans un programme C++ sur Linux/Unix/OS X/Windows - à quelles autres plateformes pourriez-vous faire référence ?

Mise à jour supplémentaire pour @Johnsyweb : Les applications C++ ne vivent pas dans un environnement C++ hermétiquement fermé. Une grande raison du succès du C++ est l'interopérabilité avec le C. Toutes les plateformes principales sont implémentées avec des interfaces C (même si l'implémentation interne utilise le C++) donc votre discours sur "l'héritage" semble déplacé. De plus, comme nous parlons d'une seule fonction, pourquoi avez-vous besoin de C++ pour cela ("C avec des classes") ? Comme je l'ai souligné, vous pouvez écrire en C++ et accéder facilement à cette fonctionnalité, et les utilisateurs de votre application se soucieront rarement de la façon dont vous l'avez implémentée.

10voto

Keith Thompson Points 85120

Il n'y a pas de solution complètement portable.

La question 19.1 de la FAQ comp.lang.c aborde ce sujet en profondeur, avec des solutions pour Windows, les systèmes de type Unix, et même MS-DOS et VMS.

Un résumé rapide et incomplet :

  • Vous pouvez utiliser la bibliothèque curses; appelez cbreak() suivi de getch() (à ne pas confondre avec la fonction getch() spécifique à Windows). Notez que curses prend généralement le contrôle du terminal, donc ceci est probablement excessif.
  • Vous pourriez pouvoir utiliser ioctl() pour manipuler les paramètres du terminal.
  • Sur les systèmes compatibles POSIX, tcgetattr() et tcsetattr() peuvent être une meilleure solution.
  • Sous Unix, vous pouvez utiliser system() pour invoquer la commande stty.
  • Sous MS-DOS, vous pouvez utiliser getch() ou getche().
  • Sous VMS (maintenant appelé OpenVMS), les routines de gestion d'écran (SMG$) pourraient fonctionner.

Toutes ces solutions en C devraient fonctionner tout aussi bien en C++; je ne connais pas de solution spécifique à C++.

6voto

Salman A Points 60620

Vous pourriez utiliser la fonction spécifique à Microsoft _getch:

#include <iostream>
#include <conio.h>
// ...
// ...
// ...
cout << "Appuyez sur une touche pour continuer..." << endl;
_getch();
cout << "Quelque chose" << endl;

6voto

BoldX Points 61

Dans Windows, ce court programme atteint l'objectif: getch met en pause la console jusqu'à ce qu'une touche soit pressée (https://www.geeksforgeeks.org/difference-getchar-getch-getc-getche/)

#include
#include

using namespace std;

void  check()
{
    char chk; int j;
    cout<<"\n\nAppuyez sur n'importe quelle touche pour continuer...";
    chk=getch();
    j=chk;
    for(int i=1;i<=256;i++)
      if(i==j) break;
    clrscr();
}

void main()
{
    clrscr();
    check();
    cout<<"\n\nÇa marche!";
    getch();
}

Il convient de noter que getch ne fait pas partie de la bibliothèque standard.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X