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

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

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

Π Π΅ΠΆΠΈΠΌΡ‹ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹

ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ считывания с ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ Ρ€Π΅ΠΆΠΈΠΌΠ°ΠΌΠΈ. Π Π΅ΠΆΠΈΠΌΡ‹ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ:

<b>#include &lt;curses.h&gt;</b>

<b>int echo(void);</b>

<b>int noecho(void);</b>

<b>int cbreak(void);</b>

<b>int nocbreak(void);</b>

<b>int raw(void);</b>

<b>int noraw(void);</b>

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ

echo
ΠΈ
noecho
просто Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ ΠΈ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ символов, Π½Π°Π±ΠΈΡ€Π°Π΅ΠΌΡ‹Ρ… Π½Π° ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π΅. ΠžΡΡ‚Π°Π²ΡˆΠΈΠ΅ΡΡ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ символы, Π½Π°Π±Ρ€Π°Π½Π½Ρ‹Π΅ Π½Π° Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π΅, становятся доступны ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ curses. Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ
cbreak
, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ прСдставлСниС ΠΎ стандартном Ρ€Π΅ΠΆΠΈΠΌΠ΅ Π²Π²ΠΎΠ΄Π°. Когда ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ curses, стартуСт с Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
initscr
, устанавливаСтся Ρ€Π΅ΠΆΠΈΠΌ Π²Π²ΠΎΠ΄Π°, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌΠΎΠΌ с ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ (cooked mode). Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΏΠΎΡΡ‚Ρ€ΠΎΡ‡Π½ΡƒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ, Ρ‚.Π΅. Π²Π²ΠΎΠ΄ становится доступСн ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ послС наТатия ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ клавиши <Enter> (ΠΈΠ»ΠΈ <Return> Π½Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π°Ρ…). Π‘ΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ символы Π½Π° ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π΅ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹, поэтому Π½Π°Π±ΠΎΡ€ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π½Ρ‹Ρ… ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сигнал Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅. Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, Ссли Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π» запускаСтся с Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°, Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ. Вызывая Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ
cbreak
, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ€Π΅ΠΆΠΈΠΌ Π²Π²ΠΎΠ΄Π°
cbreak
, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ символы становятся доступными ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ сразу послС ΠΈΡ… Π½Π°Π±ΠΎΡ€Π°, Π° Π½Π΅ ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π² Π±ΡƒΡ„Π΅Ρ€ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС наТатия клавиши <Enter>. Как ΠΈ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ с ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ, ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ символы ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚, Π° простыС клавиши, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ <Backspace>, ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ нСпосрСдствСнно Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, поэтому Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ клавиши <Backspace> ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠ»ΠΎ ΠΊ ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡Π½Ρ‹ΠΌ дСйствиям, Ρ‚ΠΎ Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ.

Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

raw
ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… символов, поэтому становится Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠΉ гСнСрация сигналов ΠΈΠ»ΠΈ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π½Π°Π±Ρ€Π°Π½Π½Ρ‹Ρ… Π½Π° ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π΅ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Ρ… ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ. Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
nocbreak
Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ€Π΅ΠΆΠΈΠΌ Π²Π²ΠΎΠ΄Π° Π² Ρ€Π΅ΠΆΠΈΠΌ с ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ символов, Π½ΠΎ Ρ€Π΅ΠΆΠΈΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… символов Π½Π΅ измСняСт; Π²Ρ‹Π·ΠΎΠ²
noraw
восстанавливаСт ΠΈ Ρ€Π΅ΠΆΠΈΠΌ с ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ, ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… символов.

ΠšΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π½Ρ‹ΠΉ Π²Π²ΠΎΠ΄

Π§Ρ‚Π΅Π½ΠΈΠ΅ с ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ β€” ΠΎΡ‡Π΅Π½ΡŒ простая опСрация. К основным функциям чтСния относятся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅:

<b>#include &lt;curses.h&gt;</b>

<b>int getch(void);</b>

<b>int getstr(char *string);</b>

<b>int getnstr(char *string, int number_of_characters);</b>

<b>int scanw(char *format, ...);</b>

ВсС ΠΎΠ½ΠΈ Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ своим Π°Π½Π°Π»ΠΎΠ³Π°ΠΌ, Π½Π΅ входящим Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ curses,

getchar
,
gets
ΠΈ
scanf
. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
getstr
Π½Π΅Ρ‚ возмоТности ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ Π΄Π»ΠΈΠ½Ρƒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠΉ строки, поэтому ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Π΅Π΅ слСдуСт с большой ΠΎΡΡ‚ΠΎΡ€ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ. Если ваша вСрсия Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ curses ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ
getnstr
, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΡƒΡŽ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ количСство считываСмых символов, всСгда примСняйтС Π΅Π΅ вмСсто Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ
getstr
. Π­Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ
gets
ΠΈ
fgets
, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Π²Ρ‹ познакомились Π² Π³Π»Π°Π²Π΅ 3.

Π’ ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠΈ 6.3 для дСмонстрации управлСния ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€ΠΎΠΉ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ipmode.c.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 6.3. Π Π΅ΠΆΠΈΠΌ ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ ΠΈ Π²Π²ΠΎΠ΄

1. НабСритС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΈ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Π² Π½Π΅Π΅ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ Π²Ρ‹Π·ΠΎΠ²Ρ‹ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ curses:

#includeΒ &lt;unistd.h&gt;

#include &lt;stdlib.h&gt;

#include &lt;curses.h&gt;

#include &lt;string.h&gt;

#define PW_LEN 256

#define NAME_LEN 256

int main() {

Β char name[NAME_LEN];

Β char password[PW_LEN];

Β const char *real_password = &quot;xyzzy&quot;;

Β int i = 0;

Β initscr();

Β move(5, 10);

Β printw(&quot;%s&quot;, &quot;Please login:&quot;);

Β move(7, 10);

Β printw(&quot;%s&quot;, &quot;User name: &quot;);

Β getstr(name);

Β move(9, 10);

Β printw(&quot;%s&quot;, &quot;Password: &quot;);

Β refresh();

2. Когда ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Π²ΠΎΠ΄ΠΈΡ‚ свой ΠΏΠ°Ρ€ΠΎΠ»ΡŒ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ символов Π½Π° экранС. Π”Π°Π»Π΅Π΅ сравнитС Π²Π²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ со строкой xyzzy:

Β cbreak();

Β noecho();

Β memset(password, '\0', sizeof(password));

Β while (i &lt; 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(&quot;%s&quot;, &quot;Correct&quot;);

Β else printw(&quot;%s&quot;, &quot;Wrong&quot;);

Β printw(&quot;%s&quot;, &quot; password&quot;);

Β refresh();