| Аппаратное обеспечение IBM PC© Александр Фролов, Григорий ФроловТом 2, книга 1, М.: Диалог-МИФИ, 1992. 
 2.6. Клавиатурные функции библиотеки 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(): 
 Еще одна полезная функция, которую можно использовать для ввода с клавиатуры - scanf(). Эта функция подробно описана во всех книгах по языку программирования Си, поэтому мы не будем ее подробно рассматривать. Отметим только, что с помощью этой функции можно организовать ввод чисел в заданном формате. Однако можно сначала ввести строку при помощи функций cgets() или gets(), а уже потом выполнять все необходимые проверки и преобразования этой строки. 
 | 


![[Назад]](../../prev.gif)
![[Содеожание]](../../sod.gif)
![[Дальше]](../../next.gif)