因此,我正在編寫一個程序,其中的任務是確定用戶是否按下了標籤。所以當他按下標籤時,我應該打印一些東西給控制檯(或者做標籤填充等)。我的問題是如何在沒有用戶按下輸入的情況下執行此操作。我試圖調查ncurses,但我找不到一個簡單的例子,會教我如何與標籤做到這一點。確定用戶是否按下了標籤
編輯: 使用Linux
因此,我正在編寫一個程序,其中的任務是確定用戶是否按下了標籤。所以當他按下標籤時,我應該打印一些東西給控制檯(或者做標籤填充等)。我的問題是如何在沒有用戶按下輸入的情況下執行此操作。我試圖調查ncurses,但我找不到一個簡單的例子,會教我如何與標籤做到這一點。確定用戶是否按下了標籤
編輯: 使用Linux
您可以使用ncurses
和getch()
功能輸入行事。它會返回一個鍵值爲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;
}
從技術上講,這不是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);
Ncurses的人說,他probebly使用Linux – stdcall 2013-03-13 17:45:43
我使用Linux – NoNameY0 2013-03-13 17:46:43
我不是100%肯定,如果我完全理解你的程序的要求,但如果我是爲一個特定的鍵不斷掃描用戶輸入,TAB在你的情況下,我會寫一個輪詢循環來檢測該鍵的ASCII值。檢測到時,向控制檯輸出消息,並繼續掃描。 – 2013-03-13 17:48:21