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