Книга: Основы программирования в Linux

Клавиатурный ввод

Клавиатурный ввод

Чтение с клавиатуры — очень простая операция. К основным функциям чтения относятся следующие:

#include <curses.h>
int getch(void);
int getstr(char *string);
int getnstr(char *string, int number_of_characters);
int scanw(char *format, ...);

Все они действуют подобно своим аналогам, не входящим в библиотеку curses, getchar, gets и scanf. Обратите внимание на то, что у функции getstr нет возможности ограничить длину возвращаемой строки, поэтому применять ее следует с большой осторожностью. Если ваша версия библиотеки curses поддерживает функцию getnstr, позволяющую ограничить количество считываемых символов, всегда применяйте ее вместо функции getstr. Это очень напоминает поведение функций gets и fgets, с которыми вы познакомились в главе 3.

В упражнении 6.3 для демонстрации управления клавиатурой приведен пример короткой программы ipmode.c.

Упражнение 6.3. Режим клавиатуры и ввод

1. Наберите программу и включите в нее начальные вызовы библиотеки curses:

#include <unistd.h>
#include <stdlib.h>
#include <curses.h>
#include <string.h>
#define PW_LEN 256
#define NAME_LEN 256
int main() {
 char name[NAME_LEN];
 char password[PW_LEN];
 const char *real_password = "xyzzy";
 int i = 0;
 initscr();
 move(5, 10);
 printw("%s", "Please login:");
 move(7, 10);
 printw("%s", "User name: ");
 getstr(name);
 move(9, 10);
 printw("%s", "Password: ");
 refresh();

2. Когда пользователь вводит свой пароль, необходимо остановить отображение символов на экране. Далее сравните введенный пароль со строкой xyzzy:

 cbreak();
 noecho();
 memset(password, '', sizeof(password));
 while (i < PW_LEN) {
  password[i] = getch();
  if (password[i] == 'n') break;
  move(8, 20 + i);
  addch('*');
  refresh();
  i++;
 }

3. В заключение восстановите отображение символов и выведите сообщение об успешном или неудачном завершении:

 echo();
 nocbreak();
 move(11, 10);
 if (strncmp(real_password, password, strlen(real_password)) == 0)
   printw("%s", "Correct");
 else printw("%s", "Wrong");
 printw("%s", " password");
 refresh();
 sleep(2);
 endwin();
 exit(EXIT_SUCCESS);
}

Как это работает

Остановив отображение клавиатурного ввода и установив режим cbreak, вы выделяете область памяти, готовую к приему пароля. Каждый введенный символ пароля немедленно обрабатывается, и на экран выводится * в следующей позиции курсора. Вам необходимо каждый раз обновлять экран и сравнивать с помощью функции strcmp две строки: введенный и реальный пароли.

Примечание

Если вы пользуетесь очень старой версией библиотеки curses, вам, возможно, понадобится выполнить дополнительный вызов функции refresh перед вызовом функции getstr. В библиотеке ncurses вызов getstr обновляет экран автоматически.

Оглавление книги

Оглавление статьи/книги

Генерация: 2.576. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз