Очистку буферу клавітури можна виконати декількома способами:

безпосередньо змінити значення покажчиків „голови” та „хвоста”, зробившиїх рівними (найбільш швидкий спосіб);

використати функцію MS-DOS AH=0Ch. Значення AL задає операцію вводу з клавіатури. Перед виконанням вводу MS-DOS виконує очистку буферу;

використовуючи функції Turbo C bioskey(1) або kbhit(), перевірити чи пустий буфер клавіатури. Якщо в буфері є будь-які символи, виконати функцію bioskey(0) або getch(). Циклічне повторення перевірки-читання очистить буфер. При цьому можна підрахувати число знищених з буферу символів. Саме так очищалась клавіатура в програмі L7_7.C.

Приведемо приклад функції cllear_kb(), що максимально швидко виконує очистку буферу клавіатури, приводячи до рівності покажчики „голови” та „хвоста”:

 

/*L7_8.C*/

  #include<dos.h>

  # include”kb.h

  void clear_kb(void)

{char register _es * tail=TAIL_PTR,

                  _es * head=HEAD_PTR;

  _ES=0x40;

  disable(); *tail=* head; enable();

}

 

Часто очистку буферу клавіатури зручно суміщати з операцією читання клавіатури. Так, наприклад, має сенс виконати самий перший ввод в програмі або введення відповіді користувача на відповідальні запрошення: підтвердження знищення файлів або іх  перевизначення, завершення роботи програми і т.д. Це не дозволить прогрмі спрацювати від випадкового натиснення клавіші до появи запрошення.

Приведемо приклад функції getc_kb(), котра вводить символ з клавіатури з попередньою очисткою буферу. Функція використовує підфункцію AL=01h функції MS-DOS AH=0Ch: введення символу з затримкою, „луною” на екран і збереженням реакції на натиснення комбінації клавішCtrl-Break. Повертає двобайтовий BIOS-код клавіші.

 

/*L7_9.C*/

#include<dos.h>

unsigned int getc_kb(void)

{ register ret_ax=0;

  _AX=0x0C01;

 geninterrupt(0x21);

ret_ax=_AL;

If(!ret_ax)/*якщо не натиснута клавіша*/

     {_AX=0x0C01; geninterrupt(0x21);

       ret­_ax=_AL; return ret_ax<<8;}

return ret_ax;

}