Se sei su Windows, puoi utilizzare kbhit()che fa parte della libreria di runtime di Microsoft. Se sei su Linux, puoi implementare kbhitcosì ( fonte ):
#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#include <fcntl.h>
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;
}
Aggiornamento: la funzione di cui sopra funziona su OS X (almeno su OS X 10.5.8 - Leopard, quindi mi aspetto che funzioni su versioni più recenti di OS X). Questa sintesi può essere salvata come kbhit.ce compilata sia su Linux che su OS X con
gcc -o kbhit kbhit.c
Quando corri con
./kbhit
Ti richiede di premere un tasto ed esce quando premi un tasto (non limitato a Invio o tasti stampabili).
@Johnsyweb - per favore elabora cosa intendi per "risposta canonica dettagliata" e "tutte le preoccupazioni". Inoltre, ri "multipiattaforma": con questa implementazione kbhit()puoi avere la stessa funzionalità in un programma C ++ su Linux / Unix / OS X / Windows - a quali altre piattaforme potresti fare riferimento?
Ulteriore aggiornamento per @Johnsyweb: le applicazioni C ++ non vivono in un ambiente C ++ sigillato ermeticamente. Una delle ragioni principali del successo di C ++ è l'interoperabilità con C. Tutte le piattaforme mainstream sono implementate con interfacce C (anche se l'implementazione interna utilizza C ++), quindi il tuo parlare di "legacy" sembra fuori luogo. Inoltre, poiché stiamo parlando di una singola funzione, perché hai bisogno di C ++ per questo ("C con classi")? Come ho sottolineato, puoi scrivere in C ++ e accedere facilmente a questa funzionalità, ed è improbabile che gli utenti della tua applicazione si preoccupino di come l' hai implementata.