避免在Linux(GCC)“ No-echo”上使用getch()按下回车键

时间:2018-12-12 14:01:25

标签: c

在下面的代码中:我不必按Enter即可使用getch()获得字符,这仅适用于Windows(mingw)。我正在编写一个简单的秒表,如果不需要按下ENTER键就可以按下键盘键来做出反应,但是在linux(GCC)上同样的事情不起作用。而且我必须只使用getch()而没有找到解决方案回声。我一直在四处搜寻,没有运气。先感谢您。 PS:我是c / c ++初学者。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void) {
  printf("\n\t\tStopwatch \n\n \t Press S to start \n\n");
  time_t start;
  char c ;
  struct tm tm ;
  do {
    c=getch(); /*get the Character without pressing ENTER*/
    if (c!= 'S' && c!= 's') printf("\nWrong key. Please press'S' to Start\n");
  } while(c!= 'S' && c!= 's');
  start=time(NULL);
  tm = *localtime(&start);
  printf("\n Starting time :: %d:%d:%d \n", tm.tm_hour, tm.tm_min, tm.tm_sec);
  return 0;
}

1 个答案:

答案 0 :(得分:2)

Unix(以及Linux)具有终端(TTY)的概念,该概念可能非常复杂。 每个过程都可以与一个终端关联(实际上很多都关联)。 该终端具有不同的选项,例如您提到的ECHO和LINE BUFFER(这是您报告的输入问题)。 要设置终端,低级API是termios(请参阅“ man termios”)。 另一个更友好的API是ncurses(请参阅“ man ncurses”)。例如,在https://www.mkssoftware.com/docs/man3/curs_inopts.3.asp,您可以看到一些用于不同设置的功能。

一个简单的ncurses示例(您可以使用“ gcc -O2 source.c -o output -Incurses”进行编译):

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

int main(void)
{
        initscr();
        cbreak();
        noecho();
        int n = getch();
        printf("%d %c\n", n, n);
}