所以我正在编写一个程序,其中的任务是确定用户是否按下了选项卡。因此,当他按下制表符时,我应该在控制台上打印一些东西(或执行制表符完成等)。我的问题是如何在没有用户按 Enter 的情况下执行此操作。我尝试查看 ncurses,但找不到一个简单的示例来教我如何使用 tab 来完成。
编辑:使用 Linux
从技术上讲,这不是 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
您可以使用和getch()
函数对输入进行操作。它会为按下的键返回一个 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;
}