1

所以我正在编写一个程序,其中的任务是确定用户是否按下了选项卡。因此,当他按下制表符时,我应该在控制台上打印一些东西(或执行制表符完成等)。我的问题是如何在没有用户按 Enter 的情况下执行此操作。我尝试查看 ncurses,但找不到一个简单的示例来教我如何使用 tab 来完成。

编辑:使用 Linux

4

2 回答 2

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);
于 2013-03-13T21:28:40.637 回答
1

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; 
}
于 2013-03-13T18:11:41.640 回答