仅在C中按某个键时停止

时间:2012-03-16 04:07:34

标签: c macos keyboard while-loop

如果我有一个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 个答案:

答案 0 :(得分:2)

您可以在UNIX-LIKE OS中使用select()机制。

一体化功能:

#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 :(得分:1)

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;
  }

答案 2 :(得分:1)

我为alexchandel的回答感到高兴。我从未听说过poll()

对于像提问者平台

这样的POSIX风格系统,

poll()是一个很好的答案

_kbhit()是MS Windows上最简单的答案。他们的民意调查()当然是不同的

1表示我的列表中只有一个描述符块,100表示​​毫秒时间

我的文件句柄是{0,对于stdin

阅读可以查询的许多事件的手册页,我只想要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;
}

答案 3 :(得分:0)

当主循环在stdin上读取char时,可以使计算在pthread中运行。如果您不想从stdin读取char,则SDL库具有更好的输入控件。 gtk也有窗口接收的事件。命令“xev”是一个用于linux的xlib程序,其工作方式类似。它打开一个空白窗口,它会在它们到来时读取关键事件。