Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

Аппаратное обеспечение персонального компьютера

© Александр Фролов, Григорий Фролов
Том 33, М.: Диалог-МИФИ, 1997, 304 стр.

[Назад] [Содеожание] [Дальше]

Клавиатурные функции стандартной библиотеки C

Стандартные библиотеки C содержат набор функций, предназначенных для работы с клавиатурой. Эти функции повторяют и немного дополняют возможности функций MS-DOS и BIOS, обслуживающих клавиатуру.

Функции getch и getche

Самые простые из функций стандартной библиотеки С, предназначенных для работы с клавиатурой - getch и getche. Они описаны в файле conio.h.

Функция getch имеет следующий прототип:

int getch(void);

Эта функция возвращает код ASCII символа, прочитанного из клавиатурного буфера, причем прочитанный символ не отображается на экране. Если была нажата функциональная клавиша или клавиша перемещения курсора, функция возвращает 0. В этом случае функцию надо вызвать еще раз для получения расширенного кода ASCII нажатой клавиши.

Функция обрабатывает клавиши <Control+C> и <Control+Break> - при вводе этих комбинаций клавиш работа программы завершается.

Если клавиатурный буфер пуст, программа переводится в состояние ожидания.

Функция getche полностью аналогична функции getch, за исключением того, что прочитанный символ отображается на экране. Приведем прототип функции getche:


	int getche(void);

Программа KBDASCII

Приведем исходные тексты программы KBDASCII, отображающей на экране коды ASCII и расширенные коды ASCII нажимаемых клавиш (листинг 2.4).

Листинг 2.4. Файл kbdascii\kbdascii.c


	// =====================================================
	// Просмотр клавиатурных кодов ASCII 
	//
	// (C) Фролов А.В, 1997
	//
	// E-mail: frolov@glas.apc.org
	// WWW:    http://www.glasnet.ru/~frolov
	//            или
	//         http://www.dials.ccas.ru/frolov
	// =====================================================
	#include <conio.h>
	#include <ctype.h>
	#include <stdio.h>
	
	int main(void)
	{
	  int key;
	  
	  printf("KBDASCII, (c) A. Frolov, 1997\n"
	    "Press any key, <Esc> to exit\n");
	  
	  // Читаем в цикле символы с клавиатуры и отображаем
	  // коды ASCII нажатых клавиш.
	  // Выходим из цикла, когда пользователь нажимает
	  // клавишу <Esc>
	  for(;;) 
	  {
	    // Читаем символ
	    key = getch();
	
	    // Если прочитанный символ равен 0, вызываем функцию 
	    // getch для получения расширенного 
	    // кода ASCII нажатой клавиши
	    if((key == 0) || (key == 0xe0)) 
	    {
	      key = getch();
	      printf("Extended code ASCII:\t" );
	    }
	    else 
	      printf( "Code ASCII:\t");
	    
	    printf("%d\n",key);
	
	    // Когда пользователь нажимает клавишу 
	    // <Esc>. выходим из цикла
	    if(key == 27) 
	      break;
	  }
	  return 0;
	}

Функция kbhit

Для проверки буфера клавиатуры на наличие символов можно использовать функцию. Она также описана в файле conio.h:


	int kbhit(void);

Если буфер клавиатуры не пуст, функция возвращает ненулевое значение. В этом случае программа может прочитать символы из буфера клавиатуры при помощи фукнкций getch и getche. Если буфер клавиатуры пуст, функция возвращает нулевое значение.

Программа KBDHIT

Приведем исходный текст программы KBDHIT (листинг 2.5), ожидающей, когда пользователь нажмет на любую клавишу. Во время ожидания программа выводит на экран поочередно символы "<" и ">".

Листинг 2.5. Файл kbdhit\kbdhit.c


	// =====================================================
	// Демонстрация применения функции kbhit
	//
	// (C) Фролов А.В, 1997
	//
	// E-mail: frolov@glas.apc.org
	// WWW:    http://www.glasnet.ru/~frolov
	//            или
	//         http://www.dials.ccas.ru/frolov
	// =====================================================
	#include <stdio.h>
	#include <conio.h>
	
	int main(void)
	{
	  int key;
	
	  // Ожидаем нажатия на любую клавишу.
	  // Во время ожидания выводим на экран поочередно
	  // символы "<" и ">"
	  while(!kbhit()) 
	    printf("<\b>\b");
	
	  // Как только будет нажата какая-нибудь клавиша,
	  // выводим ее ASCII-код
	  key = getch();
	
	  // Если прочитанный символ равен 0, вызываем 
	  // функцию getch() для получения расширенного 
	  // кода ASCII нажатой клавиши
	  if( (key == 0) || (key == 0xe0) ) 
	  {
	    key = getch();
	    printf( "Extended code ASCII:\t" );
	  }
	  else 
	    printf( "Code ASCII:\t");
	  
	  printf("%d\n",key);
	  return 0;
	}

Функция cgets

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


	char *cgets(char *buffer);

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

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

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

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

В следующем фрагменте программы функция cgets используется для ввода целого числа:


	#define MAX 80
	char buf[MAX];
	. . .
	int     i;
	char    *bufptr;
	
	// Устанавливаем максимально допустимую длину строки
	buf[0] = MAX + 2;
	printf("\nВведите целое число: ");
	
	// Вводим число, можно использовать клавиши редактирования
	bufptr = cgets(buf);
	
	// Преобразуем введенное число к формату int
	// и выводим его
	i = atoi(bufptr);
	printf("\nВы ввели число %d", i);

Функция gets

Существует и более удобная по сравнению с cgets функция, предназначенная для ввода строки с клавиатуры, а точнее, из стандартного потока ввода. Это функция gets:


	char *gets(char *buffer);

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

Эта функция читает строку из стандартного потока ввода stdin и запоминает ее в буфере buffer. Символ новой строки \n в конце введенной строки функция заменяет на нуль. После завершения ввода функция возвращает указатель на заполненный буфер или NULL в случае ошибки или условия "Конец файла".

Обратим ваше внимание на отличия между функциями cgets и gets:

·       Функция cgets позволяет редактировать вводимую строку символов, функция gets просто записывает в буфер все символы подряд (в том числе и коды клавиш редактирования).

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

·       Перед вызовом функции cgets необходимо специальным образом подготовить буфер для вводимой строки (записать в первый байт буфера длину вводимой строки). Функция gets не требует никакой подготовки буфера.

Функция scanf

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

[Назад] [Содеожание] [Дальше]