Остановите, только если какая-то клавиша нажата в C - PullRequest
2 голосов
/ 16 марта 2012

Если бы у меня был цикл while, который я хотел бы остановить только при нажатии клавиши q, как бы я это сделал? Тем не менее, я не хочу, чтобы это вполне программа

#define TRUE  1
#define FALSE 0
typedef int boolean;

int main(int argc,char* argv[]){
char *script = malloc(MAXPATH);
script = "ls";
boolean a;
a = TRUE;
while(a){ //this is the while loop i want to break incase of a keypress
system(script);
}

do something else 
something else....

Это будет работать в Mac OS X.

и getchar (), и getc () делают паузу для ответа, который останавливает цикл

Ответы [ 4 ]

2 голосов
/ 16 марта 2012

вы можете использовать механизм select () в ОС UNIX-LIKE.

все в одной функции:

#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/select.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
    fd_set readfds;
    struct timeval tv;
    int ch;
    int bool, ret;

    FD_ZERO(&readfds);
    bool = 1;
    while (bool) {
        FD_SET(STDIN_FILENO, &readfds);
        tv.tv_sec = 0;
        tv.tv_usec = 0;
        /* int select(int nfds, fd_set *readfds, fd_set *writefds,
         *           fd_set *exceptfds, struct timeval *timeout);         */
        ret = select(STDIN_FILENO + 1, &readfds, NULL, NULL, &tv);
        if (ret < 0) {
            perror("select error");
            exit(1);
        } else if (ret == 0) {
            /* timeout */
        } else if (FD_ISSET(STDIN_FILENO, &readfds)) {
            ch = fgetc(stdin);
            if (ch == 'q') {
                bool = 0;
            }
        }
        sleep(1);
        fprintf(stderr, ".");
    }

    return 0;
}
1 голос
/ 01 ноября 2017

Я рад ответу alexchandel.Я никогда не слышал о poll ()

poll () - хороший ответ для систем в стиле POSIX, таких как платформа опрашивающего

_kbhit () - самый простой ответ в MS Windows.Их опрос (), конечно, отличается

1 означает, что в моем списке только один блок дескриптора, тайм-аут равен 100 миллисекундам

мой дескриптор файла равен {0, для стандартного ввода

прочитайте справочную страницу о многих событиях, которые вы можете опросить, я только хотел POLLIN

#include <stdio.h>
#include <poll.h>
#include <errno.h>

static struct pollfd attention = { 0, POLLIN } ;

int main()
{
   int   x, y;

   for (;;)
   {
      x = poll(&attention, 1, 100);

      if (x < 0)
      {
         printf("problem %d\n", errno);
         break;
      }
      else if (x)
      {
         printf("you rang %x ?", x);
         y = getc(stdin);
         printf(" %c of course\n", y);
         if (y == '.') break;
      }
   }

   return 0;
}
1 голос
/ 16 марта 2012

родных функций в C, с помощью которых я могу обнаружить нажатие клавиши:

 getchar() and getc()

 kbhit() is a function returns integer value whenever the key is pressed

Вы можете использовать вышеуказанные функции

 #include <stdio.h>
 #include <conio.h>
 #include <math.h>
 #include <time.h>

  int main()
  {
  int m;
  clrscr();
  do
    {

   if(kbhit())
     {
     if((m=getch())==97)
       {
        printf("Key a is pressed....\n");
       }
      }
 }  while(1);
    getch();
    return 0;
  }
0 голосов
/ 16 марта 2012

Вы можете заставить вычисления выполняться в pthread, пока основной цикл читает char на stdin. Библиотека SDL имеет более удобные средства управления вводом, если вы не хотите просто читать символы из стандартного ввода. GTK также имеет события, которые получает окно. Команда "xev" - это программа xlib для linux, которая работает аналогично. Он открывает пустое окно и читает ключевые события по мере их поступления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...