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

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

Жанры

Основы программирования в 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 реальной разницы между текстовыми и бинарными файлами. Символы возврата каретки обрабатываются, только когда вы вводите или выводите их на терминал или некоторые принтеры и плоттеры.

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

Глаза погребенных

Астуриас Мигель Анхель
Проза:
классическая проза
5.00
рейтинг книги
Глаза погребенных

Я уже барон

Дрейк Сириус
2. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я уже барон

Лев Толстой

Труайя Анри
Проза:
историческая проза
5.00
рейтинг книги
Лев Толстой

#Бояръ-Аниме. Газлайтер. Том 36

Володин Григорий Григорьевич
36. История Телепата
Фантастика:
боевая фантастика
аниме
фэнтези
5.00
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 36

Адмирал. Пенталогия

Светлов Дмитрий Николаевич
Адмирал
Фантастика:
фэнтези
6.29
рейтинг книги
Адмирал. Пенталогия

Цикл романов "Целитель". Компиляция. Книги 1-17

Большаков Валерий Петрович
Целитель
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Цикл романов Целитель. Компиляция. Книги 1-17

Дьюма-Ки

Кинг Стивен
Фантастика:
ужасы и мистика
8.90
рейтинг книги
Дьюма-Ки

Искусство войны

Иванов Владимир
Фантастика:
космическая фантастика
5.00
рейтинг книги
Искусство войны

Конфликт чести. Агент перемен. Лови день

Ли Шарон
Золотая библиотека фантастики
Фантастика:
боевая фантастика
6.25
рейтинг книги
Конфликт чести. Агент перемен. Лови день

Книги Бахмана

Кинг Стивен
Шедевры фантастики
Фантастика:
ужасы и мистика
мистика
5.00
рейтинг книги
Книги Бахмана

Эпоха Опустошителя. Том IV

Павлов Вел
4. Вечное Ристалище
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Эпоха Опустошителя. Том IV

Шайтан Иван 4

Тен Эдуард
4. Шайтан Иван
Фантастика:
попаданцы
альтернативная история
8.00
рейтинг книги
Шайтан Иван 4

Прозрение (сборник)

Ле Гуин Урсула Кребер
12. Вся Ле Гуин
Фантастика:
фэнтези
6.25
рейтинг книги
Прозрение (сборник)

Барону наплевать на правила

Ренгач Евгений
7. Закон сильного
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Барону наплевать на правила