Клавиатурные функции библиотеки Microsoft C
Стандартные библиотеки трансляторов Microsoft QuickC и C 6.0 содержат набор функций, предназначенных для работы с клавиатурой. Эти функции повторяют и немного дополняют возможности функций MS-DOS и BIOS, обслуживающих клавиатуру.
Самые простые из них - getch() и getche(). Они описаны в файле conio.h.
Функция getch() имеет следующий прототип:
int getch(void);
Эта функция возвращает ASCII-код прочитанного из клавиатурного буфера символа, причем прочитанный символ не отображается на экране. Если была нажата функциональная клавиша или клавиша перемещения курсора, функция возвращает 0. В этом случае функцию надо вызвать еще раз для получения расширенного ASCII-кода нажатой клавиши.
Функция обрабатывает клавиши Ctrl-С и Ctrl-Break - при вводе этих комбинаций клавиш работа программы завершается.
Если клавиатурный буфер пуст, программа переводится в состояние ожидания.
Функция getche() полностью аналогична функции getch(), за исключением того, что прочитанный символ отображается на экране. Приведем прототип функции getche():
int getche(void);
Приведем пример программы, отображающей на экране ASCII-коды и расширенные ASCII-коды нажимаемых клавиш:
#include <conio.h> #include <ctype.h> #include <stdio.h>
void main() { int key;
// Читаем в цикле символы с клавиатуры и отображаем // ASCII-коды нажатых клавиш. // Выходим из цикла при нажатии не клавишу ESC
for(;;) {
// Читаем символ
key = getch();
// Если прочитанный символ равен 0, вызываем функцию getch() // для получения расширенного ASCII-кода нажатой клавиши
if( (key == 0) (key == 0xe0) ) { key = getch(); printf( "Расширенный ASCII-код:\t" ); }
else printf( "ASCII-код:\t");
printf("%d\n",key);
// При нажатии на клавишу ESC выходим из цикла
if( key == 27) break; } }
Для проверки буфера клавиатуры на наличие символов можно использовать функцию kbhit(). Она также описана в файле conio.h:
int kbhit(void);
Если буфер клавиатуры не пуст, функция возвращает ненулевое значение. В этом случае программа может прочитать символы из буфера клавиатуры при помощи фукнкций getch() и getche(). Если буфер клавиатуры пуст, функция возвращает нулевое значение.
bufptr = cgets(buf);
// Преобразуем введенное число к формату int // и выводим его
i = atoi(bufptr); printf("\nВы ввели число %d", i); }
Существует и более удобная для использования функция, позволяющая вводить строку с клавиатуры, а точнее, из стандартного потока ввода. Это функция gets():
char *gets(char *buffer);
Функция gets() описана в файле stdio.h.
Эта функция читает строку из стандартного потока ввода stdin и запоминает ее в буфере buffer. Символ новой строки \n в конце введенной строки функция заменяет на ноль.
После завершения ввода функция возвращает указатель на заполненный буфер или NULL в случае ошибки или условия "Конец файла".
Обратим ваше внимание на отличия между функциями cgets() и gets():
Еще одна полезная функция, которую можно использовать для ввода с клавиатуры - scanf(). Эта функция подробно описана во всех книгах по языку программирования Си, поэтому мы не будем ее подробно рассматривать. Отметим только, что с помощью этой функции можно организовать ввод чисел в заданном формате. Однако можно сначала ввести строку при помощи функций cgets() или gets(), а уже потом выполнять все необходимые проверки и преобразования этой строки.