2013-12-14 76 views
1

我遇到這樣的問題,當你按下箭頭鍵時你檢測到3個輸入並且while循環被執行了3次,實際上打印的字符串PRINT OF DEBUG發生了三次倍。 爲什麼?我會,當你按箭頭鍵循環執行1次。我該怎麼做? 下面的代碼:C檢測帶termios的箭頭鍵效果不好

#include <termios.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#include <fcntl.h> 

#define KEYCODE_R 0x43 
#define KEYCODE_L 0x44 
#define KEYCODE_U 0x41 
#define KEYCODE_D 0x42 

int main() 
{ 
    int c; 
    printf("\nPRESS A ARROW\n"); 
    while(1) 
    { 
     c = getch(); 
     printf("\nPRINT OF DEBUG\n"); 
     switch(c) 
     { 
      case KEYCODE_L:  //rilevazione pressione freccia sinistra 
       printf("\nLEFT\n");  
      break; 
      case KEYCODE_R: 
       printf("\nRIGHT\n");   
      break; 
      case KEYCODE_U: 
       printf("\nFORWARD\n"); 
      break; 
      case KEYCODE_D: 
       printf("\nINDIETRO\n"); 
      break;   
     } 
    } 
    return 0; 
} 

int getch() 
{ 
    char c; 
    struct termios before,after; 
    tcgetattr (STDIN_FILENO, &before);//STDIN_FILENO e' il File Descriptor dello stdin. Salviamo in before la configurazione attuale dello stdin 
    memcpy(&after, &before, sizeof(struct termios)); 
    after.c_lflag &=~ (ICANON | ECHO); //modifichiamo la configurazione dello stadin modificando il flag c_lflag con degli or e and bit a bit 
    after.c_cc[VMIN] = 1; 
    after.c_cc[VTIME] = 0; 
    tcsetattr (STDIN_FILENO, TCSANOW, &after); //qui effettuiamo effettivamente le modifiche 

    if (read (STDIN_FILENO, &c, sizeof(char)) == -1) //read e' una system call, leggiamo dallo stdin 
    { 
     perror("\nErrore in lettura\nIl programma termina"); 
     tcsetattr (STDIN_FILENO, TCSANOW, &before); 
     exit(-1); 
    } 

    tcsetattr (STDIN_FILENO, TCSANOW, &before); //si ripristina la configurazione dello stdin 
    return c; 
} 

感謝您的關注

+2

[getch和arrow codes]的可能重複(http://stackoverflow.com/questions/10463201/的getch和箭頭碼) – usr2564301

回答

1

的殘培最終將獲得三個十六進制代碼:0x1B 0x5B和[×41,的0x42,0x43中,或0x44進行。當它得到0x1B(轉義字符)時,switch語句不會執行任何操作。對於0x5B也是一樣。

最後得到的字符就是你正在處理的字符。如果您想查看某些內容,請在您的switch聲明中添加默認值。添加默認值會讓你知道你正在獲得整個轉義序列。 (你應該真正地處理輸入,除非你完全肯定地知道用戶只會按下箭頭鍵。)