Переносимая альтернатива 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()
функция.