Чтение онлайн

на главную - закладки

Жанры

Основы программирования в Linux
Шрифт:

 "a — add new record", "d — delete record", "q - quit", NULL,

};

int getchoice(char *greet, char *choices[]);

2. Функция

main
вызывает функцию
getchoice
с образцом пунктов меню
menu
:

int main {

 int choice = 0;

 do {

choice = getchoice("Please select an action", menu);

printf("You have chosen: %c\n", choice);

 } while (choice != 'q');

 exit(0);

}

3. Теперь важный фрагмент кода — функция, которая и выводит на экран меню и считывает ввод пользователя:

int getchoice(char *greet, char *choices[]) {

 int chosen = 0;

 int selected;

 char **option;

 do {

printf("Choice: %s\n", greet);

option = choices;

while (*option) {

printf("%s\n", *option);

option++;

}

selected = getchar;

option = choices;

while (*option) {

if (selected == *option[0]) {

chosen = 1;

break;

}

option++;

}

if (!chosen) {

printf("Incorrect choice, select again\n");

}

 } while (!chosen);

 return selected;

}

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

Функция

getchoice
выводит на экран приглашение для ввода
greet
и меню
choices
и просит пользователя ввести первый символ выбранного пункта. Далее выполняется цикл до тех пор, пока функция
getchar
не вернет символ, совпадающий с первой буквой одного из элементов массива option.

Когда вы откомпилируете и выполните программу, то обнаружите, что она ведет себя не так, как ожидалось. Для того чтобы продемонстрировать возникающую проблему, далее приведен вариант диалога на экране терминала.

$ ./menu1

Choice: Please select an action

a — add new record

d — delete record

q — quit

a

You have chosen: a

Choice: Please select an action

a — add new record

d — delete record

q — quit

Incorrect choice, select again

Choice: Please select an action

а — add new record

d — delete record

q — quit

q

You have chosen: q $

Для того чтобы сделать выбор, пользователь должен последовательно нажать клавиши <А>, <Enter>, <Q>, <Enter>. Здесь возникают, как минимум, две проблемы; самая серьезная заключается в том, что вы получаете сообщение "Incorrect choice" ("Неверный выбор") после каждого корректного выбора. Кроме того, вы еще должны нажать клавишу <Enter> (или <Return>), прежде чем программа считает введенные данные.

Сравнение канонического и неканонического режимов

Обе эти проблемы тесно связаны. По умолчанию ввод терминала не доступен программе до тех пор, пока пользователь не нажмет клавишу <Enter> или <Return>. В большинстве случаев это достоинство, поскольку данный способ позволяет пользователю корректировать ошибки набора с помощью клавиш <Backspace> или <Delete>. Только когда он остается доволен увиденным на экране, пользователь нажимает клавишу <Enter>, чтобы ввод стал доступен программе.

Такое поведение называется каноническим или стандартным режимом. Весь ввод обрабатывается как последовательность строк. Пока строка ввода не завершена (обычно с помощью нажатия клавиши <Enter>), интерфейс терминала управляет всеми нажатыми клавишами, включая <Backspace>, и приложение не может считать ни одного символа.

Прямая противоположность — неканонический режим, в котором приложение получает больше возможностей контроля над обработкой вводимых символов. Мы еще вернемся к этим двум режимам немного позже в этой главе.

Помимо всего прочего, обработчик терминала в ОС Linux помогает превращать символы прерываний в сигналы (например, останавливающие выполнение программы, когда вы нажмете комбинацию клавиш <Ctrl>+<C>), он также может автоматически выполнить обработку нажатых клавиш <Backspace> и <Delete> и вам не придется реализовывать ее в каждой написанной вами программе. О сигналах вы узнаете больше в главе 11.

Итак, что же происходит в данной программе? ОС Linux сохраняет ввод до тех пор, пока пользователь не нажмет клавишу <Enter>, и затем передает в программу символ выбранного пункта меню и следом за ним код клавиши <Enter>. Каждый раз, когда вы вводите символ пункта меню, программа вызывает функцию

getchar
, обрабатывает символ и снова вызывает
getchar
, немедленно возвращающую символ клавиши <Enter>.

Символ, который на самом деле видит программа, — это не символ ASCII возврата каретки CR (десятичный код 13, шестнадцатеричный 0D), а символ перевода строки LF (десятичный код 10, шестнадцатеричный 0A). Так происходит потому, что на внутреннем уровне ОС Linux (как и UNIX) всегда применяет перевод строки для завершения текстовых строк, т. е. в отличие от других ОС, таких как MS-DOS, использующих комбинацию символов возврата каретки и перевода строки, ОС UNIX применяет, для обозначения новой строки только символ перевода строки. Если вводное или выводное устройство посылает или запрашивает и символ возврата каретки, в ОС Linux об этом заботится обработчик терминала. Если вы привыкли работать в MS-DOS или других системах, это может показаться странным, но одно из существенных преимуществ заключается в отсутствии в ОС Linux реальной разницы между текстовыми и бинарными файлами. Символы возврата каретки обрабатываются, только когда вы вводите или выводите их на терминал или некоторые принтеры и плоттеры.

Поделиться:
Популярные книги

Хозяин оков VI

Матисов Павел
6. Хозяин Оков
Фантастика:
фэнтези
попаданцы
гаремник
5.00
рейтинг книги
Хозяин оков VI

Черный дембель. Часть 1

Федин Андрей Анатольевич
1. Черный дембель
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Черный дембель. Часть 1

Золото Советского Союза: назад в 1975. Книга 2

Майоров Сергей
2. Золото Советского Союза
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Золото Советского Союза: назад в 1975. Книга 2

Орден Архитекторов 12

Винокуров Юрий
12. Орден Архитекторов
Фантастика:
фэнтези
5.00
рейтинг книги
Орден Архитекторов 12

Я все еще барон

Дрейк Сириус
4. Дорогой барон!
Фантастика:
боевая фантастика
5.00
рейтинг книги
Я все еще барон

Глава рода

Шелег Дмитрий Витальевич
5. Живой лёд
Фантастика:
боевая фантастика
6.55
рейтинг книги
Глава рода

Наследник старого рода

Шелег Дмитрий Витальевич
1. Живой лёд
Фантастика:
фэнтези
8.19
рейтинг книги
Наследник старого рода

Телохранитель Генсека. Том 1

Алмазный Петр
1. Медведев
Фантастика:
попаданцы
альтернативная история
7.00
рейтинг книги
Телохранитель Генсека. Том 1

Моя простая курортная жизнь

Блум М.
1. Моя простая курортная жизнь
Проза:
современная проза
5.00
рейтинг книги
Моя простая курортная жизнь

Эволюционер из трущоб. Том 6

Панарин Антон
6. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Эволюционер из трущоб. Том 6

Последний Паладин. Том 9

Саваровский Роман
9. Путь Паладина
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Последний Паладин. Том 9

Мастер...

Чащин Валерий
1. Мастер
Фантастика:
героическая фантастика
попаданцы
аниме
6.50
рейтинг книги
Мастер...

Треск штанов

Ланцов Михаил Алексеевич
6. Сын Петра
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Треск штанов

Локки 9. Потомок бога

Решетов Евгений Валерьевич
9. Локки
Фантастика:
фэнтези
попаданцы
героическая фантастика
боевая фантастика
5.00
рейтинг книги
Локки 9. Потомок бога