Клавиатурные функции библиотеки Mocrosoft C
Стандартные библиотеки трансляторов Mocrosoft Quick и C 6.0 содержат набор функций, предназначенных для работы с клавиатурой. Эти функции повторяют и немного дополняют возможмости функций MS-DOS и BIOS, обслуживающих клавиатуру.
Самые простые из них - getch() и getche(). Они списаны в файле conio.h.
Функция getch() имеет следующий прототип: int getch(void);
Эта функция возвращает ASCII-код прочитанного из клавиатурного буфера символа, причем прочитанный символ не отображается на экране. Если была нажата функциональная клавиша или клавиша перемещения курсора, функция возвращает 0. В этом случае функцию надо вызывать еще раз для получения расширенного ASCII-кода нажатой клавиши.
Функция обрабатывает клавиши Ctrl-C и 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( "pасширенный 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 <stdio.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(), а уже потом выполнять все необходимые проверки и преобразования этой строки.
ДЛЯ ЗАМЕТОК
КЛАВИАТУРА IBM PC
УЧЕБНО-МЕТОДИЧЕСКОЕ ПОСОБИЕ
для специальности “Программное и аппаратное обеспечение вычислительной техники и сетей”
|