Клавиатурные функции библиотеки 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(). Если буфер клавиатуры пуст, функция возвращает нулевое значение.

Приведем пример программы, ожидающей нажатия на любую клавишу. Во время ожидания программа выводит на экран поочередно символы "<" и ">": #include <conio.h> void main() { int key; // Ожидаем нажатия на любую клавишу. // Во время ожидания выводим на экран поочередно // символы "<" и ">" while(!kbhit()) printf("<\b>\b"); // Как только будет нажата какая-нибудь клавиша, // выводим ее ASCII-код key = getch(); // Если прочитанный символ равен 0, вызываем функцию getch() // для получения расширенного ASCII-кода нажатой клавиши if( (key == 0) || (key == 0xe0) ) { key = getch(); printf( "Расширенный ASCII-код:\t" ); } else printf( "ASCII-код:\t"); printf("%d\n",key); }

Для ввода с клавиатуры строки символов можно использовать функцию cgets(), работающую аналогично функции 0Ah прерывания MS-DOS INT 21h: char *cgets(char *buffer);

Функция описана в файле conio.h.

Перед вызовом аргумент функции buffer должен указывать на массив, размер которого должен быть достаточным для хранения вводимой строки, завершающего строку нулевого байта и двух дополнительных байтов. Первый элемент массива buffer[0] должен содержать максимальную длину вводимой строки - как и для функции 0Ah прерывания MS-DOS INT 21h.

После завершения ввода второй элемент массива buffer[1] будет содержать длину введенной строки, сама строка будет завершаться символами новой строки NL, перевода строки LF и нулем.

Функция cgets() возвращает указатель на начало введенной строки в буфере, т.е. на третий элемент массива buffer[2].

Приведем простой пример, в котором функция cgets() используется для ввода целого числа: #include <stdlib.h> #include <string.h> #include <conio.h> #define MAX 80 char buf[MAX]; void main() { int i; char *bufptr; // Устанавливаем максимально допустимую длину строки buf[0] = MAX + 2; printf("\nВведите целое число: "); // Вводим число, можно использовать клавиши редактирования 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():

  • Функция cgets() позволяет редактировать вводимую строку символов, функция gets() просто записывает в буфер все символы подряд (в том числе и коды клавиш редактирования).
  • Программе, использующей для ввода с клавиатуры функцию cgets(), недоступны средства переназначения ввода операционной системы. Если же программа использует функцию gets(), которая читает строку из стандартного потока ввода, можно использовать средства переназначения.
  • Перед вызовом функции cgets() необходимо специальным образом подготовить буфер для вводимой строки (записать в первый байт буфера длину вводимой строки). Функция gets() не требует никакой подготовки буфера.

Еще одна полезная функция, которую можно использовать для ввода с клавиатуры - scanf(). Эта функция подробно описана во всех книгах по языку программирования Си, поэтому мы не будем ее подробно рассматривать. Отметим только, что с помощью этой функции можно организовать ввод чисел в заданном формате. Однако можно сначала ввести строку при помощи функций cgets() или gets(), а уже потом выполнять все необходимые проверки и преобразования этой строки.



Содержание раздела