2014-03-04 198 views
1

我在Windows計算機上編譯和執行我的程序在cygwin中。我在C語言方面經驗不足,但我想要一種方法來檢測一個鍵是否被按下而沒有提示用戶(例如我)。下面顯示了具有理想功能的僞代碼。有沒有辦法檢測一個鍵是否被按下?

char ch; 
while(1){ 
    if(KeyBeenPressed()){ 
    //a key has been pressed before getting here 
     ch=getKeyPressed(); 
     if(ch=='0'){ 
      printf("you have pressed 0"); 
     } 
     else{ 
      printf("you did't press key 0"); 
     } 
    } 

//do other stuff 
} 

和我自己嘗試在網上搜索後,解決這個如下所示。

#include <stdio.h> 
#include <conio.h> 
char ch; 
void main(){ 
    while(1){ 
     if(kbhit()){ //kbhit is 1 if a key has been pressed 
      ch=getch(); 
      printf("pressed key was: %c", ch); 
     } 
    } 
} 

與此代碼的問題是,該文件CONIO.H無法找到(我還沒有發現任何其他的方式來解決這個問題)。顯然,gcc編譯器不能處理conio.h(我已經附上鍊接了)。 http://www.programmingsimplified.com/c/conio.h

所以我想如果任何你們知道的路要走,如果一個鍵在c壓檢測,我也想最好檢索按鍵的字符(我打算用0-9的這個應用程序)。重要的是程序不能等到按下某個鍵。

我很感激任何可以解決這個問題的建議! 問候函 Henrik

+0

There:http://stackoverflow.com/questions/4293355/detecting-key-press-in-c-without-prompting-the-user – Jean

+0

linux:http://stackoverflow.com/questions/2984307/c -key-in-linux-console –

回答

2

我對kbhit()使用以下函數。它在Ubuntu中的g ++編譯器上工作正常。

#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; 
} 
+0

這段代碼工作得非常好。但我想知道從tcgetattr(STDIN_FILENO,&oldt);到fcntl(STDIN_FILENO,F_SETFL,oldf | O_NONBLOCK)發生了什麼事情;我將盡力自己找到它,但如果您有時間,我將不勝感激,謝謝您的幫助! //亨利克 – Henrik

+0

tcgetattr(STDIN_FILENO,&oldt); 螈= 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); – Henrik

+0

我試着在你提出問題後找到語句的完整含義,一般來說,getchar()是阻塞的,即等待用戶輸入並在用戶按下'ENTER'鍵之後繼續進行,所以tcgetattr和tcsetattr用於從終端獲取輸入,而不需要預先輸入ss'ENTER'鍵。 tcgetattr在oldt中獲取終端的當前設置。 tecsetattr設置終端的新設置。 fcntl用於從stdin中獲取非阻塞的輸入。讀取字符後,使用tcsetattr和fnctl恢復以前的設置。 –

0

大多數DOS的的,Windows 3.x或win32平臺提供文件CONIO.H,但UNIX或Linux 操作系統是不能正常提供此文件。如果你使用unix或者linux操作系統,你必須自己下載到互聯網上。我希望我的回答對你有用。

相關問題