Не нажимайте ввод с помощью getch () в Linux (GCC) "No-echo" - PullRequest
0 голосов
/ 12 декабря 2018

В следующем коде: мне не нужно нажимать Enter, чтобы получить символ с помощью getch (), и это применимо только в Windows (mingw).Я программирую простой секундомер, который реагирует, если клавиша клавиатуры нажата без необходимости нажимать клавишу ВВОД, но то же самое не работает в Linux (GCC). И мне нужно найти решение, только используя getch () безэхо.Я гуглил без удачи.Заранее спасибо.PS: я новичок в ac / 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 голосов
/ 12 декабря 2018

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 -lncurses"):

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

int main(void)
{
        initscr();
        cbreak();
        noecho();
        int n = getch();
        printf("%d %c\n", n, n);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...