Книга: Основы программирования в 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
обновляет экран автоматически.
- 1.6 Драйверы и буферы ввода-вывода
- 1.8 Ввод-вывод типичного приложения хранения данных
- Глава 6 BIOS – базовая система ввода-вывода
- 5.2.2.2. Устройства ввода информации в персональный компьютер
- Можно ли входить в систему без ввода имени и пароля?
- 13.3.1. Пакетный ввод
- Создание документов и ввод текста
- Ввод и форматирование текста в таблице
- Ввод данных в ячейки
- Вводящие в заблуждение заявления и прочие стратегии использования посланий
- Практическая работа 42. Создание электронной таблицы, ввод данных и формул
- Правила ввода формул