Консольне введення даних За призначенням клавіші клавіатури можна поділити на групи: – символьні; – клавіші керування: Home, End, …, Delete та чотири стрілки; – функціональні: F1, F2, …, F12; – шифт-клавіші: Shift, Alt, Ctrl; – перемикальні (тригерні) клавіші: NumLock, CapsLock, … – спеціальні клавіші: Pause/Break, … Керування роботою клавіатури здійснює контролер. При натисненні на клавішу контролер передає в процесор запит на переривання і номер клавіші (скен – код).
При натисненні клавіш перших трьох груп, у буфер клавіатури заноситься двобайтовий код. У разі символьних клавіш молодший байт цього коду дорівнює ASCII – коду символа. У старший байт – записується скен-код натиснутої клавіші. Якщо ж натиснуто функціональну клавішу, клавішу керування або комбінацію з клавішею Alt, Ctrl, то в буфер записується двобайтовий код, молодший байт якого дорівнює нулю, а старший – розширеному ASCII – коду клавіші. Окреме натиснення перемикальних клавіш, шифт-клавіш не змінює вміст буфера, оскільки ці клавіші призначені для розширення функцій інших.
Функції консольного введення даних На відміну від стандартних функцій потокоорієнтованого введення даних, функції введення, оголошені в, не виконують проміжної буферизації, а зчитують дані безпосередньо з буфера клавіатури ФункціяПризначення cgets()Введення символьного рядка cscanf()Форматне введення даних getch()Введення одного символа без відображення getche()Введення одного символа з відображенням getpass()Введення пароля kbhit()Перевірка натискання довільної клавіші ungetch()Повернення натискання у буфер клавіатури
Функція getch() повертає ASCII – код, якщо натиснено символьну клавішу, або нуль, якщо натиснено клавішу керування, функціональну або клавішну комбінацію. У цьому випадку потрібно ще раз викликати функцію для отримання розширеного ASCII – коду. Приклад: функція, яка відстежує натискання на клавішу Esc, клавіши стрілок, Home та End, і пересуває курсор у відповідну позицію. #include #define Esc 0x1b /*ASCII-код клавіші Esc*/ int MoveCursor (void) {
int key, x, y; int winw, winh; /*розміри вікна*/ struct text_info win; /*структура параметрів вікна*/ key = getch(); /*зчитування коду клавіші*/ If (key ==Esc) return 0; /*натиснуто Esc */ else if (key != 0) return -1; /*символьну клавішу*/ gettextinfo( &win); /*параметри активного вікна*/ winw = win.winright – win.winleft + 1; /*ширина*/ winh = win.winbottom – win.wintop + 1; /*висота*/ x = win.curx; y = win.cury; /*поточні коорд. курсора*/ switch (key = getch()) /*розширений код клавіші*/ {
case 77: if (x */ case 80: if (y<winh) y++; break; /*натиснено вниз*/ case 75: if (x>1) x--; break; /*натиснено <-*/ case 72: if (y>1) y--; break; /*натиснено вгору*/ case 71: x = 1; y = 1; break; /*натиснено Home*/ case 79: x = winw; y =winh; break; /*натиснено End*/ default: return -1; /*інша клавіша керування*/ } gotoxy (x, y); /*перенесення курсора в нову позицію*/ return 1; }
Функція kbhit () перевіряє, чи відбулось натиснення на клавіші ( точніше, чи є в буфері незчитані символи). Повертає нуль, якщо буфер порожній, та ненульове значення, якщо в буфері є символи. Звертання до функції не зупиняє виконання програми та не зчитує символів з буфера клавіатури. За допомогою функції можна забезпечити циклічне виконання потрібних дій, поки не буде натиснуто довільну клавішу: do { …… } while ( ! kbhit () );