1

我需要一种以可移植方式使用 kbhit 和 getch 功能的方法。我目前正在开发一个简单的 ascii 游戏,我需要检测是否按下了某个键。如果是,我需要阅读它,如果不是,我需要继续而不等待输入。我宁愿不附和它,但我不会对此挑剔。我认为 kbhit 和 getch 对此非常有用,但我只被允许使用完全可移植的代码(至少是用于 linux、mac 和 PC 的代码,但我不会想到很多其他操作系统)。据我了解,termios、curses 和 conio 库并没有在我需要的所有三个操作系统上完全实现。我不知所措。我发现的每个解决方案都使用不可移植的代码。有没有办法我自己可以为此编写可移植的函数?我目前包括 stdio.h、stdlib.h 和 time.h。我还需要一种便携式方式来清除屏幕,因为我目前正在使用 system("cls") 和 system("clear") 每次我更改操作系统时也必须更改它们,或者是我可以做的一种方式if-else 并检测代码正在运行的操作系统以在这两个语句之间切换。这是具有这些功能的一段代码:

    char key = ' ';
    while(1)
    {
        system("cls");
        if (_kbhit())
        {
            key =_getch();
            printf("output: %c", key);
        }    
        else
            printf("output:");
    }

这基本上是我在代码中需要的功能,但我想不出一种可移植的方式来做到这一点,而且我的老师要求代码使用标准 c 和标准库在 Linux、mac 和 pc 上工作。请帮忙!请不要使用 c++,我们使用的是 c。

编辑:我不认为 ncurses 不是我想要的。有人建议我#ifdef在编译时使用来实现这些。我喜欢这个解决方案,但我需要一些帮助来了解如何在 linux 和 mac 上执行此操作,因为我只能使用当前设置在 windows 上进行测试。希望我很快就会在我的另一台机器上运行 linux 进行测试,但是 OSX 的价格很高,所以我将不胜感激。这是当前代码:

 //libraries
#include <stdio.h>      //used for i/o
#include <stdlib.h>     //used for clearing the screen
#include <time.h>       //used to get time for random number generator

//check OS and include necessary libraries
#ifdef _WIN32
    //code for Windows (32-bit and 64-bit, this part is common)
    #include <conio.h>
    #define CLEARSCREEN system("cls")
    #define CHECKKEY _kbhit()
    #define NBGETCHAR getch()

#elif __APPLE__
    //code for mac
    #define CLEARSCREEN system("clear")
    #define CHECKKEY 
    #define NBGETCHAR 

#elif __linux__
    //code for linux
    #define CLEARSCREEN system("clear")
    #define CHECKKEY 
    #define NBGETCHAR 

#else
#   error "Unknown compiler"
#endif

int main()
{
    char key = ' ';
    while(1)
    {
        CLEARSCREEN;
        if (CHECKKEY)
        {
            key=NBGETCHAR;
            printf("output: %c", key);
        }    
        else
            printf("output:");
    }
}
4

1 回答 1

3

您应该查看可移植的ncurses库。除了许多其他用于在终端中绘图的工具外,它还提供了一个键盘界面,其中包含一个getch()功能。

于 2015-12-10T01:57:05.107 回答