Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠžΡΠ½ΠΎΠ²Ρ‹ программирования Π² LinuxΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 80

Автор ΠœΡΡ‚ΡŒΡŽ НСйл

НСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π·Π°Π½ΠΎΠ²ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ для управлСния Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚-дисков Π½Π΅ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚ свСт Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° Π³Π»Π°Π²Ρ‹ 7, Π΅Π³ΠΎ основы Π²Ρ‹ Π·Π°Π»ΠΎΠΆΠΈΡ‚Π΅ Π² этой Π³Π»Π°Π²Π΅. Π“Π»Π°Π²Π° 6 посвящСна curses, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой вовсС Π½Π΅ Π΄Ρ€Π΅Π²Π½Π΅Π΅ проклятиС, Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‰ΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ высокого уровня для управлСния ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π½Π° экранС Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°. ΠŸΠΎΠΏΡƒΡ‚Π½ΠΎ Π²Ρ‹ ΡƒΠ·Π½Π°Π΅Ρ‚Π΅ Ρ‡ΡƒΡ‚ΡŒ большС ΠΎ Ρ€Π°Π·ΠΌΡ‹ΡˆΠ»Π΅Π½ΠΈΡΡ… ΠΏΡ€Π΅ΠΆΠ½ΠΈΡ… ΠΏΡ€ΠΎΡ„ΠΈ UNIX, познакомившись с основными ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°ΠΌΠΈ систСм Linux ΠΈ UNIX ΠΈ понятиСм Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°. НизкоуровнСвый доступ, прСдставлСнный Π² этой Π³Π»Π°Π²Π΅, Π±Ρ‹Ρ‚ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ. Π‘ΠΎΠ»ΡŒΡˆΠ°Ρ Ρ‡Π°ΡΡ‚ΡŒ Ρ‚ΠΎΠ³ΠΎ, ΠΎ Ρ‡Π΅ΠΌ ΠΌΡ‹ пишСм здСсь, Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΡ…ΡΡ Π² ΠΎΠΊΠ½Π΅ консоли, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ эмуляторы Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° KDE's Konsole, GNOME's gnome-terminal ΠΈΠ»ΠΈ стандартный X11 xterm.

Π’ этой Π³Π»Π°Π²Π΅ Π²Ρ‹, Π² частности, ΡƒΠ·Π½Π°Π΅Ρ‚Π΅ ΠΎ:

β–‘ Ρ‡Ρ‚Π΅Π½ΠΈΠΈ с Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° ΠΈ записи Π½Π° Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»;

β–‘ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π°Ρ… Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° ΠΈ ΠΎΠ±Ρ‰Π΅ΠΌ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠΌ интСрфСйсС (General Terminal Interface, GTI);

β–‘ структурС Ρ‚ΠΈΠΏΠ°

termios
;

β–‘ Π²Ρ‹Π²ΠΎΠ΄Π΅ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° ΠΈ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…

terminfo
;

β–‘ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠΈ наТатия клавиш.

Π§Ρ‚Π΅Π½ΠΈΠ΅ с Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° ΠΈ запись Π½Π° Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»

Π’ Π³Π»Π°Π²Π΅ 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: %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.

Когда Π²Ρ‹ ΠΎΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Ρ‚ΠΎ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° Π²Π΅Π΄Π΅Ρ‚ сСбя Π½Π΅ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ оТидалось. Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰ΡƒΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, Π΄Π°Π»Π΅Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π΄ΠΈΠ°Π»ΠΎΠ³Π° Π½Π° экранС Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°.

$ <b>./menu1</b>

Choice: Please select an action

a β€” add new record

d β€” delete record

q β€” quit

<b>a</b>

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

<b>q</b>

You have chosen: q $

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ‹Π±ΠΎΡ€, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π°ΠΆΠ°Ρ‚ΡŒ клавиши <А>, <Enter>, <Q>, <Enter>. Π—Π΄Π΅ΡΡŒ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚, ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ, Π΄Π²Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹; самая ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Π°Ρ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚Π΅ сообщСниС "Incorrect choice" ("НСвСрный Π²Ρ‹Π±ΠΎΡ€") послС ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ Π²Ρ‹Π±ΠΎΡ€Π°. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π²Ρ‹ Π΅Ρ‰Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π½Π°ΠΆΠ°Ρ‚ΡŒ ΠΊΠ»Π°Π²ΠΈΡˆΡƒ <Enter> (ΠΈΠ»ΠΈ <Return>), ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° считаСт Π²Π²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅.

Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ каноничСского ΠΈ нСканоничСского Ρ€Π΅ΠΆΠΈΠΌΠΎΠ²

ОбС эти ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ тСсно связаны. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π²Π²ΠΎΠ΄ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π° Π½Π΅ доступСн ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π΅ Π½Π°ΠΆΠΌΠ΅Ρ‚ ΠΊΠ»Π°Π²ΠΈΡˆΡƒ <Enter> ΠΈΠ»ΠΈ <Return>. Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв это достоинство, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π΄Π°Π½Π½Ρ‹ΠΉ способ позволяСт ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ошибки Π½Π°Π±ΠΎΡ€Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ клавиш <Backspace> ΠΈΠ»ΠΈ <Delete>. Волько ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ остаСтся Π΄ΠΎΠ²ΠΎΠ»Π΅Π½ ΡƒΠ²ΠΈΠ΄Π΅Π½Π½Ρ‹ΠΌ Π½Π° экранС, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π°ΠΆΠΈΠΌΠ°Π΅Ρ‚ ΠΊΠ»Π°Π²ΠΈΡˆΡƒ <Enter>, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Π²ΠΎΠ΄ стал доступСн ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅.