Переносимая альтернатива kbhit() и getch() и system("cls")

Мне нужен способ использовать функциональность kbhit и getch переносимым способом. В настоящее время я разрабатываю простую игру ascii, и мне нужно определить, нажата ли клавиша. Если это так, мне нужно прочитать его, а если нет, мне нужно продолжить, не дожидаясь ввода. Я бы предпочел не повторять это, но я не буду разборчив в этом. Я думаю, что kbhit и getch были бы хороши для этого, НО мне разрешено использовать только полностью переносимый код (ну, по крайней мере, код для Linux, Mac и ПК, хотя на ум приходит не так много других ОС). Насколько я понимаю, термины, 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:");
    }

По сути, это то, что мне нужно в моем коде, но я не могу найти переносимый способ сделать это, и мой учитель требует, чтобы код работал на Linux, Mac и PC, используя стандартные 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:");
    }
}

1 ответ

Вы должны заглянуть в портативную библиотеку ncurses. В дополнение ко многим другим инструментам для рисования в терминале, он предоставляет интерфейс клавиатуры, который включает в себя getch() функция.

Другие вопросы по тегам