Π Π΅ΠΆΠΈΠΌΡ ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΡ
ΠΡΠΎΡΠ΅Π΄ΡΡΡ ΡΡΠΈΡΡΠ²Π°Π½ΠΈΡ Ρ ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΡ ΡΠΏΡΠ°Π²Π»ΡΡΡΡΡ ΡΠ΅ΠΆΠΈΠΌΠ°ΠΌΠΈ. Π Π΅ΠΆΠΈΠΌΡ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΡ
ΡΡΠ½ΠΊΡΠΈΠΉ:
<b>#include <curses.h></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 <curses.h></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Β <unistd.h>
#include <stdlib.h>
#include <curses.h>
#include <string.h>
#define PW_LEN 256
#define NAME_LEN 256
int main() {
Β char name[NAME_LEN];
Β char password[PW_LEN];
Β const char *real_password = "xyzzy";
Β int i = 0;
Β initscr();
Β move(5, 10);
Β printw("%s", "Please login:");
Β move(7, 10);
Β printw("%s", "User name: ");
Β getstr(name);
Β move(9, 10);
Β printw("%s", "Password: ");
Β refresh();
2.Β ΠΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π²Π²ΠΎΠ΄ΠΈΡ ΡΠ²ΠΎΠΉ ΠΏΠ°ΡΠΎΠ»Ρ, Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² Π½Π° ΡΠΊΡΠ°Π½Π΅. ΠΠ°Π»Π΅Π΅ ΡΡΠ°Π²Π½ΠΈΡΠ΅ Π²Π²Π΅Π΄Π΅Π½Π½ΡΠΉ ΠΏΠ°ΡΠΎΠ»Ρ ΡΠΎ ΡΡΡΠΎΠΊΠΎΠΉ xyzzy:
Β cbreak();
Β noecho();
Β memset(password, '\0', sizeof(password));
Β while (i < 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("%s", "Correct");
Β else printw("%s", "Wrong");
Β printw("%s", " password");
Β refresh();