2013-03-13 37 views
1

因此,我正在編寫一個程序,其中的任務是確定用戶是否按下了標籤。所以當他按下標籤時,我應該打印一些東西給控制檯(或者做標籤填充等)。我的問題是如何在沒有用戶按下輸入的情況下執行此操作。我試圖調查ncurses,但我找不到一個簡單的例子,會教我如何與標籤做到這一點。確定用戶是否按下了標籤

編輯: 使用Linux

+0

Ncurses的人說,他probebly使用Linux – stdcall 2013-03-13 17:45:43

+0

我使用Linux – NoNameY0 2013-03-13 17:46:43

+0

我不是100%肯定,如果我完全理解你的程序的要求,但如果我是爲一個特定的鍵不斷掃描用戶輸入,TAB在你的情況下,我會寫一個輪詢循環來檢測該鍵的ASCII值。檢測到時,向控制檯輸出消息,並繼續掃描。 – 2013-03-13 17:48:21

回答

0

您可以使用ncursesgetch()功能輸入行事。它會返回一個鍵值爲int的int值,您可以通過查看返回值是否爲9來檢查選項卡。此代碼將循環顯示被按下的內容,直到它出現爲選項卡爲止。

#include <stdio.h> 
#include <stdlib.h> 
#include <assert.h> 
#include <ncurses.h> 

int main() { 
    int c; 
    initscr(); /* Start curses mode */ 
    cbreak(); 
    noecho(); 
    while(9 != (c = getch())) { 
    printw("%c\n", c); 
    if(halfdelay(5) != ERR) { /* getch function waits 5 tenths of a second */ 
     while(getch() == c) 
     if(halfdelay(1) == ERR) /* getch function waits 1 tenth of a second */ 
     break; 
    } 
    printw("Got a %d\n", c); 
    cbreak(); 
    } 
    endwin(); 
    return 0; 
} 
1

從技術上講,這不是C語言問題,而是操作系統或運行時環境。在POSIX系統上,您必須至少以非規範模式設置您的終端。

規範模式緩衝鍵盤輸入以在需要時進一步處理它們(例如,這可讓您在應用程序看到它們之前擦除字符)。

有許多方法切換到非規範模式。當然,你可以使用許多不同的庫ncurses等。但背後的訣竅是一系列叫做termios的系統調用。你需要做的是讀取POSIX終端的當前屬性並根據你的需要修改它們。例如:

struct termios old, new; 

/* read terminal attributes */ 
tcgetattr(STDIN_FILENO,&old); 

/* get old settings */ 
new=old; 

/* modify the current settings (common: switch CANON and ECHO) */ 
new.c_lflag &=(~ICANON & ~ECHO); 

/* push the settings on the terminal */ 
tcsetattr(STDIN_FILENO,TCSANOW,&new); 

do_what_you_want_and_read_every_pressed_char(); 

/* ok, restore initial behavior */ 
tcsetattr(STDIN_FILENO,TCSANOW,&old);