如何在 C 中监听用户输入的同时 运行 编程?

How to run program whilst listening for user input in C?

我正在尝试制作一个持续 运行 直到按下某个键的游戏,然后它应该接受该键并对其进行一些处理,然后照常继续 运行。我该怎么做?

我在 MAC 所以即使我遇到了一个名为 conio.h 的 windows 库,它可以使用 kbhit() 和 getch() 来处理这个问题,我可以'让它为我工作...

//
//  main.c
//  conioTesting
//
//

#include <stdio.h>
#include "myconio_mac.h"

int main(int argc, const char * argv[]) {

    int counter = 0;

    while (counter < 2) {
        if (kbhit()) {
            char key = getch();
            printf("\n Key is %c \n", key);
            printf("Keyboard hit detected \n");
        } else {
            printf("Nothing. \n");
        }
    }
    printf("Passed!!!!!!!!!! \n");
}

在MAC上,您需要fiddle用终端设置关闭线路缓冲。 (您也可以关闭 echo。)正确设置终端后,您可以使用 read 从键盘获取单个字符。

在下面的示例代码中,kbsetup 函数负责终端设置。 getkey 函数检查是否有按键按下,如果有则 returns 按键,如果没有读取任何按键则 '[=14=]'main 函数有一个循环,每秒打印一次时间,并打印用户按下的任何键。按 'q' 退出程序。

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <time.h>
#include <termios.h>
#include <unistd.h>

static struct termios oldSettings;

void kbcleanup( void )
{
    tcsetattr( 0, TCSAFLUSH, &oldSettings );     /* restore old settings */
}

void kbsetup( void )
{
    tcgetattr( 0, &oldSettings );

    struct termios newSettings = oldSettings;

    newSettings.c_lflag &= ~ICANON;   /* disable line-at-a-time input */
    newSettings.c_lflag &= ~ECHO;     /* disable echo */
    newSettings.c_cc[VMIN]  = 0;      /* don't wait for characters */
    newSettings.c_cc[VTIME] = 0;      /* no minimum wait time */

    if ( tcsetattr( 0, TCSAFLUSH, &newSettings ) == 0 ){
        atexit( kbcleanup );    /* restore the terminal settings when the program exits */
    } else {
        fprintf( stderr, "Unable to set terminal mode\n" );
        exit( 1 );
    }
}

int getkey( void )
{
    char c;

    if ( read( STDIN_FILENO, &c, 1 ) == 0 )
        return '[=10=]';
    else
        return c;
}

int main( void )
{
    int c;

    kbsetup();

    time_t start = time( NULL );
    time_t previous = start;
    for (;;)
    {
        usleep( 1000 );
        time_t current = time( NULL );

        if ( current != previous )
        {
            fprintf( stderr, "tick %3ld\r", current - start );
            previous = current;
        }
        else if ( (c = getkey()) != '[=10=]' )
        {
            if ( c == 'q' || c == 'Q' )
                break;
            printf( "\ngot char: 0x%02x", c );
            if ( isprint( c ) )
                printf( " '%c'", c );
            printf( "\n" );
        }
    }
}

听起来您想等待按下某个键然后继续执行:

//test.c

#include <pthread.h>
#include <stdio.h>

void *input_listener(void *threadarg)
{
  getchar();
  printf("A key was pressed.\n");
}

int main()
{
  printf("Start\n");
  pthread_t thread;
  pthread_create(&thread, NULL, input_listener, NULL);
  pthread_join(thread, NULL);

  // Continue main
}

使用pthreads应该很简单(需要编译:gcc test.c -lpthread)。