2009-12-01 6 views
1

Je suis en train de coder un terminal comme Linux terminal avec C sous Linux OS et j'ai besoin de quitter le programme lorsque l'utilisateur appuie sur les mots-clés ctrl + D. Mais je ne sais pas comment comprendre que l'utilisateur a appuyé sur ces mots-clés. Merci pour votre aide.Comment puis-je comprendre que l'utilisateur a appuyé sur quel mot-clé?

Je reçois des entrées avec fgets()

Répondre

3

Ctrl + D est en fin de fichier. Dans ce cas, fgets() renverra un pointeur NULL.

Alors, peut regarder probablement la boucle principale de votre programme quelque chose comme ceci:

char buffer[2000]; 
const char* input = fgets(buffer, sizeof(buffer), stdin); 
while (input) { 
    do_something_with(input); 
    input = fgets(buffer, sizeof(buffer), stdin); 
} 

Notez que cela ne fonctionne que pour l'entrée en mémoire tampon simple. Pour plus d'informations sur la manipulation du clavier bas niveau, consultez http://tldp.org/HOWTO/Keyboard-and-Console-HOWTO.html

+0

Oui CTRL + D termine mon programme. mon problème est résolu temporairement. mais je pense que je vais avoir besoin de contrôles par mot-clé à l'avenir. C'est peut-être CTRL + {A, B, ...}. Puis-je comprendre les actions de l'utilisateur sur le clavier. – FTI

+0

Ctrl-D n'est pas une fin de fichier. Ctrl-D n'est que le paramètre par défaut du membre de tableau VEOF c_cc de la structure 'termios', et VEOF n'est pas un tampon de fin de fichier, mais plutôt un tampon de type tty-pending. – sambowry

2

Voici un petit exemple, comment lire des frappes de touches individuelles à partir d'un clavier du terminal:

#include <stdio.h> 
#include <termios.h> 
#include <unistd.h> 

int main(void){ 
    struct termios save,raw; 
    tcgetattr(0,&save); 
    cfmakeraw(&raw); tcsetattr(0,TCSANOW,&raw); 
    unsigned char ch; 
    do{ 
    read(0,&ch,1); 
    if(ch<32) printf("read: Ctrl+%c (%i)\r\n",ch+'@',ch); 
    else  printf("read: '%c' (%i)\r\n",ch,ch); 
    }while(ch!='q'); 
    tcsetattr(0,TCSANOW,&save); 
} 

Mieux vaut savoir comment un terminal envoie les frappes avant de commencer en utilisant ncurses pour gérer les E/S du terminal.