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

Чтение с терминала и запись на терминал

В главе 3 вы узнали, что, когда программа запускается из командной строки, оболочка обеспечивает присоединение к ней стандартных потоков ввода и вывода. Вы получаете возможность взаимодействия с пользователем простым применением подпрограмм getchar и printf для чтения из стандартного потока ввода и записи в стандартный поток вывода.

В упражнении 5.1 в программе menu1.c вы попытаетесь переписать на языке С подпрограммы формирования меню, использующие только эти две функции.

Упражнение 5.1. Подпрограммы формирования меню на языке C

1. Начните со следующих строк, определяющих массив, который будет использоваться как меню, и прототип (описание) функции getchoice:

#include <stdio.h>
#include <stdlib.h>
char *menu[] = {
 "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: %cn", choice);
 } while (choice != 'q');
 exit(0);
}

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

int getchoice(char *greet, char *choices[]) {
 int chosen = 0;
 int selected;
 char **option;
 do {
  printf("Choice: %sn", greet);
  option = choices;
  while (*option) {
   printf("%sn", *option);
   option++;
  }
  selected = getchar();
  option = choices;
  while (*option) {
   if (selected == *option[0]) {
    chosen = 1;
    break;
   }
   option++;
  }
  if (!chosen) {
   printf("Incorrect choice, select againn");
  }
 } 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>), прежде чем программа считает введенные данные.

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


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