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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π―Π·Ρ‹ΠΊ программирования Π‘ΠΈ. ИзданиС 3-Π΅, исправлСнноС». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 10

Автор Π‘Ρ€Π°ΠΉΠ°Π½ ΠšΠ΅Ρ€Π½ΠΈΠ³Π°Π½

Когда ΠΌΡ‹ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ»ΠΈ строку Π±ΠΎΠ»Π΅Π΅ Π΄Π»ΠΈΠ½Π½ΡƒΡŽ, Ρ‡Π΅ΠΌ самая длинная ΠΈΠ· всСх ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ…, Ρ‚ΠΎ Π½Π°ΠΌ Π½Π°Π΄ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π³Π΄Π΅-Ρ‚ΠΎ Π΅Π΅ Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ. Π—Π΄Π΅ΡΡŒ Π½Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ΡΡ вторая функция, copy, которая ΡƒΠΌΠ΅Π΅Ρ‚ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ строку Π² Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠ΅ мСсто.

НаконСц, Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° главная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, которая Π±Ρ‹ управляла функциями getline ΠΈ copy. Π’ΠΎΡ‚ ΠΊΠ°ΠΊ выглядит наша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π² Ρ†Π΅Π»ΠΎΠΌ:

#include β€Ήstdio.hβ€Ί

#define MAXLINE 1000 /* ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π²Π²ΠΎΠ΄ΠΈΠΌΠΎΠΉ строки */


int getline(char line[], int MAXLINE);

void copy(char to[], char from[]);


/* ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ самой Π΄Π»ΠΈΠ½Π½ΠΎΠΉ строки */

main()

{

 int len; /* Π΄Π»ΠΈΠ½Π° Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ строки */

 int max; /* Π΄Π»ΠΈΠ½Π° максимальной ΠΈΠ· просмотрСнных строк */

 char line[MAXLINE]; /* тСкущая строка */

 char longest[MAXLINE]; /* самая длинная строка */


 max = 0;

 while (len = getline(line, MAXLINE)) β€Ί 0)

  if (len β€Ί max) {

   max = len;

   copy(longest, line);

  }

 if (max β€Ί 0) /* Π±Ρ‹Π»Π° Π»ΠΈ Ρ…ΠΎΡ‚ΡŒ ΠΎΠ΄Π½Π° строка? */

  printf("%s", longest);

 return 0;

}


/* getline: Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ строку Π² s, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π΄Π»ΠΈΠ½Ρƒ */

int getline(char s[], int lim)

{

 int c, i;


 for (i = 0; i β€Ή lim-1 && (c = getchar()) != EOF && с != '\n'; ++i)

  s[i] = c;

 if (c == '\n') {

  s[i] = c;

  ++i;

 }

 s[i] = '\0';

 return i;

}


/* copy: ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈΠ· 'from' Π² 'to'; to достаточно большой */

void copy(char to[], char from[])

{

 int i;


 i = 0;

 while ((to[i] = from[i]) != '\0')

  ++i;

}

ΠœΡ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ getline ΠΈ copy, описанныС Π² Π½Π°Ρ‡Π°Π»Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, находятся Π² Ρ‚ΠΎΠΌ ΠΆΠ΅ Ρ„Π°ΠΉΠ»Π΅, Ρ‡Ρ‚ΠΎ ΠΈ main.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ main ΠΈ getline Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‚ ΠΌΠ΅ΠΆΠ΄Ρƒ собой Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ°Ρ€Ρƒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π’ getline Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ строкой

int getline(char s[], int lim);

Как ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Π΅Π΅ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ s Π΅ΡΡ‚ΡŒ массив, Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ, lim, ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ int. Π—Π°Π΄Π°Π½ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° массива Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ†Π΅Π»ΡŒΡŽ Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ памяти. Π’ самой getline Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ Π΄Π»ΠΈΠ½Ρƒ массива s Π½Π΅Ρ‚ нСобходимости, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΡƒΠΊΠ°Π·Π°Π½ Π² main. Π§Ρ‚ΠΎΠ±Ρ‹ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, getline ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ return Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ это Π΄Π΅Π»Π°Π΅Ρ‚ функция power. Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ строкС Ρ‚Π°ΠΊΠΆΠ΅ сообщаСтся, Ρ‡Ρ‚ΠΎ getline Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° int, Π½ΠΎ Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ отсутствии указания ΠΎ Ρ‚ΠΈΠΏΠ΅ подразумСваСтся int, Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π΄ getline слово int ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ.

Одни Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π΄Ρ€ΡƒΠ³ΠΈΠ΅ (Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ copy) Π½ΡƒΠΆΠ½Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ произвСсти ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ дСйствия, Π½Π΅ выдавая Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ значСния. На мСстС Ρ‚ΠΈΠΏΠ° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Π² copy стоит void. Π­Ρ‚ΠΎ явноС ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ значСния данная функция Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚.

Ѐункция getline Π² ΠΊΠΎΠ½Π΅Ρ† создаваСмого Сю массива ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ символ '\0' (null-символ, ΠΊΠΎΠ΄ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ Π±Π°ΠΉΡ‚ΠΎΠΌ), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ ΠΊΠΎΠ½Π΅Ρ† строки символов. Π’ΠΎ ΠΆΠ΅ соглашСниС ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ окончания Π½ΡƒΠ»Π΅ΠΌ ΡΠΎΠ±Π»ΡŽΠ΄Π°Π΅Ρ‚ΡΡ ΠΈ Π² случаС строковой константы Π²Ρ€ΠΎΠ΄Π΅

"hello\n"

Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС для Π½Π΅Π³ΠΎ формируСтся массив ΠΈΠ· символов этой строки с '\0' Π² ΠΊΠΎΠ½Ρ†Π΅.

h Π΅ l l o \n \0

БпСцификация %s Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ printf ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π΅ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ - строка символов, оформлСнная ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ Π²Ρ‹ΡˆΠ΅ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. Ѐункция copy Π² своСй Ρ€Π°Π±ΠΎΡ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅ опираСтся Π½Π° Ρ‚ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹ΠΉ Сю Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ заканчиваСтся символом '\0', ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ½Π° ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ наряду с ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ символами. (Всё сказанноС ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ '\0' Π½Π΅ встрСчаСтся Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ тСкста.)

ΠŸΠΎΠΏΡƒΡ‚Π½ΠΎ стоит Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ Π΄Π°ΠΆΠ΅ с Ρ‚Π°ΠΊΠΎΠΉ малСнькой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ ΠΌΡ‹ сталкиваСмся с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ конструктивными трудностями. НапримСр, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ»ΠΆΠ½Π° Π΄Π΅Π»Π°Ρ‚ΡŒ main, Ссли встрСтится строка, ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°ΡŽΡ‰Π°Ρ допустимый Ρ€Π°Π·ΠΌΠ΅Ρ€? Ѐункция getline Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π°Π΄Π΅ΠΆΠ½ΠΎ: Ссли массив ΠΏΠΎΠ»ΠΎΠ½, ΠΎΠ½Π° ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π°Π΅Ρ‚ пСрСсылку, Π΄Π°ΠΆΠ΅ Ссли символа Π½ΠΎΠ²ΠΎΠΉ строки Π½Π΅ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ»Π°. ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠ² ΠΎΡ‚ getline Π΄Π»ΠΈΠ½Ρƒ строки ΠΈ ΡƒΠ²ΠΈΠ΄Π΅Π², Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° совпадаСт с MAXLINE, главная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° main ΠΌΠΎΠ³Π»Π° Π±Ρ‹ "ΠΎΡ‚Π»ΠΎΠ²ΠΈΡ‚ΡŒ" этот особый случай ΠΈ ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒΡΡ с Π½ΠΈΠΌ. Π’ интСрСсах краткости описаниС этого случая ΠΌΡ‹ здСсь опускаСм.

ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ getline Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°Ρ€Π°Π½Π΅Π΅ ΡƒΠ·Π½Π°Ρ‚ΡŒ, сколь Π΄Π»ΠΈΠ½Π½Ρ‹ΠΌΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π²Π²ΠΎΠ΄ΠΈΠΌΡ‹Π΅ строки, поэтому getline Π΄Π΅Π»Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π½Π° ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅. А Π²ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ copy Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… строк извСстны (ΠΈΠ»ΠΈ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡ… ΡƒΠ·Π½Π°Ρ‚ΡŒ), поэтому Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ здСсь Π½Π΅ Π½ΡƒΠΆΠ΅Π½.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 1.16. ΠŸΠ΅Ρ€Π΅ΠΏΠΈΡˆΠΈΡ‚Π΅ main ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½Π° ΠΌΠΎΠ³Π»Π° ΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ ΡΠ°ΠΌΡƒΡŽ Π΄Π»ΠΈΠ½Π½ΡƒΡŽ строку Π±Π΅Π· ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ Π½Π° Π΅Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 1.17. ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ всСх Π²Π²ΠΎΠ΄ΠΈΠΌΡ‹Ρ… строк, содСрТащих Π±ΠΎΠ»Π΅Π΅ 80 символов.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 1.18. ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, которая Π±ΡƒΠ΄Π΅Ρ‚ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π²Π²ΠΎΠ΄ΠΈΠΌΠΎΠΉ строкС Π·Π°ΠΌΠ΅Π½ΡΡ‚ΡŒ стоящиС подряд символы ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ² ΠΈ табуляций Π½Π° ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΠ±Π΅Π» ΠΈ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ пустыС строки.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 1.19. ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ reverse(s), Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°ΡŽΡ‰ΡƒΡŽ символы Π² строкС s Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС. ΠŸΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅ Π΅Π΅ ΠΏΡ€ΠΈ написании ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, которая ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Π²Π²ΠΎΠ΄ΠΈΠΌΡƒΡŽ строку располагаСт Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС.

1.10 Π’Π½Π΅ΡˆΠ½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ line, longest ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΠ΅ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main, ΠΈΠ»ΠΈ, ΠΊΠ°ΠΊ говорят, Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ Π² Π½Π΅ΠΉ. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΈ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ Π²Π½ΡƒΡ‚Ρ€ΠΈ main, Π½ΠΈΠΊΠ°ΠΊΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ прямо ΠΊ Π½ΠΈΠΌ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚. Π’ΠΎ ΠΆΠ΅ Π²Π΅Ρ€Π½ΠΎ ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. НапримСр, i Π² getline Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ ΠΊ i Π² copy. КаТдая локальная пСрСмСнная Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ обращСния ΠΊ этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ исчСзаСт послС Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΈΠ· Π½Π΅Π΅. Π’ΠΎΡ‚ ΠΏΠΎΡ‡Π΅ΠΌΡƒ Ρ‚Π°ΠΊΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, слСдуя Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΎΠ»ΠΎΠ³ΠΈΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… языков, Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ автоматичСскими. (Π’ Π³Π»Π°Π²Π΅ 4 обсуТдаСтся класс памяти static, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ свои значСния Π² ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΊΠ°Ρ… ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ.)

Π’Π°ΠΊ ΠΊΠ°ΠΊ автоматичСскиС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ΡΡ ΠΈ ΠΈΡΡ‡Π΅Π·Π°ΡŽΡ‚ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ с Π²Ρ…ΠΎΠ΄ΠΎΠΌ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄ΠΎΠΌ ΠΈΠ· Π½Π΅Π΅, ΠΎΠ½ΠΈ Π½Π΅ ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ своих Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΎΡ‚ Π²Ρ‹Π·ΠΎΠ²Π° ΠΊ Π²Ρ‹Π·ΠΎΠ²Ρƒ ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒΡΡ Π·Π°Π½ΠΎΠ²ΠΎ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π½ΠΎΠ²ΠΎΠΌ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Если этого Π½Π΅ Π΄Π΅Π»Π°Ρ‚ΡŒ, ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ "мусор".

Π’ качСствС Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹ автоматичСским ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ внСшниС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΏΠΎ ΠΈΡ… ΠΈΠΌΠ΅Π½Π°ΠΌ ΠΈΠ· любой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. (Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π΅Π½ области COMMON Π² Π€ΠΎΡ€Ρ‚Ρ€Π°Π½Π΅ ΠΈ опрСдСлСниям ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π² самом внСшнСм Π±Π»ΠΎΠΊΠ΅ Π² ПаскалС.) Π’Π°ΠΊ ΠΊΠ°ΠΊ внСшниС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ доступны повсСмСстно, ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ вмСсто Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² для связи ΠΌΠ΅ΠΆΠ΄Ρƒ функциями ΠΏΠΎ Π΄Π°Π½Π½Ρ‹ΠΌ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ внСшниС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ постоянно, Π° Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ ΠΈ ΠΈΡΡ‡Π΅Π·Π°ΡŽΡ‚ Π½Π° ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ выполнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, свои значСния ΠΎΠ½ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ ΠΈ послС Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΈΡ… ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΠ²ΡˆΠΈΡ….

Π’Π½Π΅ΡˆΠ½ΡΡ пСрСмСнная Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, Π²Π½Π΅ тСкста любой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ; Π² этом случаС Π΅ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π΄Π΅Π»Π΅Π½Π° ΠΏΠ°ΠΌΡΡ‚ΡŒ. Она Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ объявлСна Π²ΠΎ всСх функциях, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ хотят Сю ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ. ОбъявлСниС содСрТит свСдСния ΠΎ Ρ‚ΠΈΠΏΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. ОбъявлСниС ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ явным, Π² Π²ΠΈΠ΄Π΅ инструкции extern, ΠΈΠ»ΠΈ нСявным, ΠΊΠΎΠ³Π΄Π° нуТная информация получаСтся ΠΈΠ· контСкста. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сказанноС, ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡˆΠ΅ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ самой Π΄Π»ΠΈΠ½Π½ΠΎΠΉ строки с использованиСм line, longest ΠΈ max Π² качСствС Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. Π­Ρ‚ΠΎ ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² Π²Ρ‹Π·ΠΎΠ²Π°Ρ…, ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½ΠΈΡΡ… ΠΈ Ρ‚Π΅Π»Π°Ρ… всСх Ρ‚Ρ€Π΅Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

#include β€Ήstdio.hβ€Ί


#define MAXLINE 1000 /* ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π²Π²ΠΎΠ΄ΠΈΠΌΠΎΠΉ строки */


int max; /* Π΄Π»ΠΈΠ½Π° максимальной ΠΈΠ· просмотрСнных строк */

char line[MAXLINE]; /* тСкущая строка */

char longest[MAXLINE]; /* самая длинная строка */


int getline(void);

void copy(void);


/* ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ самой Π΄Π»ΠΈΠ½Π½ΠΎΠΉ строки: спСциализированная вСрсия */

main()

{

 int len;

 extern int max;

 extern char longest[];

 max = 0;

 while ((len = getline()) β€Ί 0)

 if (len β€Ί max) {

  max = len;

  copy();

 }

 if (max β€Ί 0) /* Π±Ρ‹Π»Π° хотя Π±Ρ‹ ΠΎΠ΄Π½Π° строка */

  printf("%s", longest);

 return 0;

}


/* getline: спСциализированная вСрсия */

int getline(void)

{

 int c, i;

 extern char line[];

 for (i = 0; i β€Ή MAXLINE-1 && (c=getchar()) != EOF && c!= '\n'; ++i)