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

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

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

char amessage[] = "now is the time"; /* массив */

char *pmessage = "now is the time"; /* ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ */

amessage - это массив, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΉ Ρ‚Π°ΠΊΠΎΠΉ объСм, Ρ‡Ρ‚ΠΎ Π² Π½Π΅ΠΌ ΠΊΠ°ΠΊ Ρ€Π°Π· помСщаСтся указанная ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ символов ΠΈ '\0'. ΠžΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ символы Π²Π½ΡƒΡ‚Ρ€ΠΈ массива ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ, Π½ΠΎ amessage всСгда ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ мСсто памяти. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π΅ΠΌΡƒ pmessage Π΅ΡΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° ΡΡ‚Ρ€ΠΎΠΊΠΎΠ²ΡƒΡŽ константу. А Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ указатСля ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ, ΠΈ Ρ‚ΠΎΠ³Π΄Π° послСдний Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° Ρ‡Ρ‚ΠΎ-Π»ΠΈΠ±ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ΅. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½, Ссли Π²Ρ‹ ΠΏΠΎΠΏΡ‹Ρ‚Π°Π΅Ρ‚Π΅ΡΡŒ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ содСрТимоС константы.

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚Ρ‹, связанныС с указатСлями ΠΈ массивами, ΠΏΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ Π½Π° нСсколько Π²ΠΈΠ΄ΠΎΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½Ρ‹Ρ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°Ρ… Π΄Π²ΡƒΡ… ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, взятых Π½Π°ΠΌΠΈ ΠΈΠ· стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. ΠŸΠ΅Ρ€Π²Π°Ρ ΠΈΠ· Π½ΠΈΡ…, функция strcpy (s, t), ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ строку t Π² строку s. Π₯ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Π±Ρ‹ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ прямо s = t, Π½ΠΎ Ρ‚Π°ΠΊΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, Π° Π½Π΅ символы. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ символы, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ†ΠΈΠΊΠ». ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ strcpy, с использованиСм массива, ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²ΠΈΠ΄:

/* strcpy: ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ t Π² s; Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ с индСксируСмым массивом*/

void strcpy(char *s, char *t)

{

 int i;

 i = 0;

 while ((s[i] = t[i]) != '\0')

  i++;

}

Для сравнСния ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ Π²Π΅Ρ€ΡΠΈΡŽ strcpy с указатСлями:

/* strcpy: ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ t Π² s: вСрсия 1 (с указатСлями) */

void strcpy(char *s, char *t)

{

 while ((*s = *t) != '\0') {

  s++;

  t++;

 }

}

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ лишь ΠΊΠΎΠΏΠΈΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², strcpy ΠΌΠΎΠΆΠ΅Ρ‚ свободно ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ s ΠΈ t ΠΊΠ°ΠΊ своими Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ. Они Π΄ΠΎΠ»ΠΆΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ указатСлями, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ³Π°ΡŽΡ‚ΡΡ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ символ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· массивов Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π² ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΉ строкС t Π½Π΅ встрСтится '\0'.

На ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ strcpy Ρ‚Π°ΠΊ Π½Π΅ ΠΏΠΈΡˆΡƒΡ‚. ΠžΠΏΡ‹Ρ‚Π½Ρ‹ΠΉ программист ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚Π΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΡƒΡŽ запись:

/* strcpy: ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ t Π² s; вСрсия 2 (с указатСлями) */

void strcpy(char *s, char *t)

{

 while ((*s++ = *t++) != '\0')

  ;

}

ΠŸΡ€ΠΈΡ€Π°Ρ‰Π΅Π½ΠΈΠ΅ s ΠΈ t здСсь осущСствляСтся Π² ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰Π΅ΠΉ части Ρ†ΠΈΠΊΠ»Π°. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ *t++ являСтся символ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ пСрСмСнная t ΠΏΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΎ; постфиксный ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ++ Π½Π΅ измСняСт ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ t, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ взят символ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ½ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚. Π’ΠΎ ΠΆΠ΅ Π² ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ s: сначала символ запомнится Π² ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ староС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ s, ΠΈ лишь послС этого Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ s увСличится. ΠŸΠ΅Ρ€Π΅ΡΡ‹Π»Π°Π΅ΠΌΡ‹ΠΉ символ являСтся ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ сравниваСтся с '\0'. Π’ ΠΈΡ‚ΠΎΠ³Π΅ ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‚ΡΡ всС символы, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΈ Π·Π°ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ символ '\0'.

Π—Π°ΠΌΠ΅Ρ‚ΠΈΠ², Ρ‡Ρ‚ΠΎ сравнСниС с '\0' здСсь лишнСС (ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² Π‘ΠΈ Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ выраТСния Π² условии трактуСтся ΠΈ ΠΊΠ°ΠΊ Π΅Π³ΠΎ ΠΈΡΡ‚ΠΈΠ½Π½ΠΎΡΡ‚ΡŒ), ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎ ΠΈ послСднСС сокращСниС тСкста ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹:

/* strcpy: ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ t Π² s; вСрсия 3 (с указатСлями) */

void strcpy(char *s, char *t)

{

 while (*s++ = *t++)

  ;

}

Π₯отя Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ, выглядит Π·Π°Π³Π°Π΄ΠΎΡ‡Π½ΠΎ, всС ΠΆΠ΅ такая запись Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠ΄ΠΎΠ±Π½Π΅Π΅, ΠΈ слСдуСт ΠΎΡΠ²ΠΎΠΈΡ‚ΡŒ Π΅Π΅, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² Π‘ΠΈ-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ с Π½Π΅ΠΉ часто Π²ΡΡ‚Ρ€Π΅Ρ‡Π°Ρ‚ΡŒΡΡ.

Π§Ρ‚ΠΎ касаСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ strcpy ΠΈΠ· стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ β€Ήstring.hβ€Ί Ρ‚ΠΎ ΠΎΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π² качСствС своСго Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Π΅Ρ‰Π΅ ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π½ΠΎΠ²ΡƒΡŽ копию строки.

Вторая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ здСсь рассмотрим, это strcmp(s,t). Она сравниваСт символы строк s ΠΈ t ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅, Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ ΠΈΠ»ΠΈ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ссли строка s соотвСтствСнно лСксикографичСски мСньшС, Ρ€Π°Π²Π½Π° ΠΈΠ»ΠΈ большС, Ρ‡Π΅ΠΌ строка t. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ получаСтся Π²Ρ‹Ρ‡ΠΈΡ‚Π°Π½ΠΈΠ΅ΠΌ ΠΏΠ΅Ρ€Π²Ρ‹Ρ… Π½Π΅ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‰ΠΈΡ… символов ΠΈΠ· s ΠΈ t.

/* strcmp: Π²Ρ‹Π΄Π°Π΅Ρ‚ β€Ή 0 ΠΏΡ€ΠΈ s β€Ή t, 0 ΠΏΡ€ΠΈ s - t, β€Ί 0 ΠΏΡ€ΠΈ s β€Ί t */

int strcmp(char *s, char *t)

{

 int i;

 for (i = 0; s[i] == t[i]; i++)

  if (s[i] == '\0')

   return 0;

 return s[i] - t[i];

}

Π’Π° ΠΆΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° с использованиСм ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ выглядит Ρ‚Π°ΠΊ:

/* strcmp: Π²Ρ‹Π΄Π°Π΅Ρ‚ β€Ή 0 ΠΏΡ€ΠΈ s β€Ή t, 0 ΠΏΡ€ΠΈ s - t, β€Ί 0 ΠΏΡ€ΠΈ s β€Ί t */

int strcmp(char *s, char *t)

{

 for (; *s == *t; s++, t++)

  if (*s == '\0')

   return 0;

 return *s - *t;

}

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ++ ΠΈ - ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ»ΠΈ прСфиксными, ΠΈΠ»ΠΈ постфиксными, Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ (хотя ΠΈ Π½Π΅ Ρ‚Π°ΠΊ часто) Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΈΡ… сочСтания с ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ *. НапримСр.

*--p;

ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ p ΠΏΡ€Π΅ΠΆΠ΄Π΅, Ρ‡Π΅ΠΌ ΠΏΠΎ этому ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ символ. НапримСр, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π΄Π²Π° выраТСния:

*p++ = val; /* ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ val Π² стСк */

val = *--p; /* Π²Π·ΡΡ‚ΡŒ ΠΈΠ· стСка Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π² val */

ΡΠ²Π»ΡΡŽΡ‚ΡΡ стандартными для посылки Π² стСк ΠΈ взятия ΠΈΠ· стСка (см. ΠΏΠ°Ρ€Π°Π³Ρ€Π°Ρ„ 4.3.).

ОбъявлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, упомянутых Π² этом ΠΏΠ°Ρ€Π°Π³Ρ€Π°Ρ„Π΅, Π° Ρ‚Π°ΠΊΠΆΠ΅ ряда Π΄Ρ€ΡƒΠ³ΠΈΡ… стандартных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΡ… со строками, содСрТатся Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ β€Ήstring.hβ€Ί.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 5.3. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ, Π½Π°ΠΏΠΈΡˆΠΈΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ strcat, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ рассматривали Π² Π³Π»Π°Π²Π΅ 2 (функция strcat(s,t) ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ строку t Π² ΠΊΠΎΠ½Π΅Ρ† строки s).

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 5.4. ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ strend(s,t), которая Π²Ρ‹Π΄Π°Π΅Ρ‚ 1, Ссли строка t располоТСна Π² ΠΊΠΎΠ½Ρ†Π΅ строки s, ΠΈ Π½ΡƒΠ»ΡŒ Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 5.5. ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ strncpy, strncat ΠΈ strncmp, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ с ΠΏΠ΅Ρ€Π²Ρ‹ΠΌΠΈ символами своих Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², число ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π΅Ρ‚ n. НапримСр, strncpy(t,s,n) ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ n символов t Π² s. ΠŸΠΎΠ»Π½Ρ‹Π΅ описания этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ содСрТатся Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ B.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 5.6. ΠžΡ‚Π±Π΅Ρ€ΠΈΡ‚Π΅ подходящиС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… Π³Π»Π°Π² ΠΈ ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠΉ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΈΡ…, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ вмСсто индСксирования ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ. ΠŸΠΎΠ΄ΠΎΠΉΠ΄ΡƒΡ‚, Π² частности, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ getline (Π³Π»Π°Π²Ρ‹ 1 ΠΈ 4), atoi, itoa ΠΈ ΠΈΡ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ (Π³Π»Π°Π²Ρ‹ 2, 3 ΠΈ 4), reverse (Π³Π»Π°Π²Π° 3), Π° Ρ‚Π°ΠΊΠΆΠ΅ strindex ΠΈ getop (Π³Π»Π°Π²Π° 4).

5.6 ΠœΠ°ΡΡΠΈΠ²Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ, ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ

Как ΠΈ Π»ΡŽΠ±Ρ‹Π΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² массивы. Для ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΠΈ этого напишСм ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΡΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽΡ‰ΡƒΡŽ Π² Π°Π»Ρ„Π°Π²ΠΈΡ‚Π½ΠΎΠΌ порядкС тСкстовыС строки; это Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ sort систСмы UNIX.

Π’ Π³Π»Π°Π²Π΅ 3 ΠΌΡ‹ ΠΏΡ€ΠΈΠ²Π΅Π»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ сортировки ΠΏΠΎ Π¨Π΅Π»Π»Ρƒ, которая упорядочиваСт массив Ρ†Π΅Π»Ρ‹Ρ…, Π° Π² Π³Π»Π°Π²Π΅ 4 ΡƒΠ»ΡƒΡ‡ΡˆΠΈΠ»ΠΈ Π΅Π΅, повысив быстродСйствиС. Π’Π΅ ΠΆΠ΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΈ здСсь, ΠΎΠ΄Π½Π°ΠΊΠΎ, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ тСкстовыС строки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ€Π°Π·Π½ΡƒΡŽ Π΄Π»ΠΈΠ½Ρƒ ΠΈ сравнСниС ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π·Π° ΠΎΠ΄Π½Ρƒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ. Нам Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ прСдставлСниС Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±Ρ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ»ΠΎ ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΈ эффСктивно Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с тСкстовыми строками ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹.

Для этого Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ массивом ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° Π½Π°Ρ‡Π°Π»Π° строк. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ строки Π² памяти располоТСны Π²ΠΏΠ»ΠΎΡ‚Π½ΡƒΡŽ Π΄Ρ€ΡƒΠ³ ΠΊ Π΄Ρ€ΡƒΠ³Ρƒ, ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ строкС доступ просто ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π΅Π΅ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ символ. Π‘Π°ΠΌΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Π²ΠΈΠ΄Π΅ массива. Одна ΠΈΠ· возмоТностСй ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ Π΄Π²Π΅ строки - ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° Π½ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ strcmp. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ мСстами строки, достаточно Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ мСстами Π² массивС ΠΈΡ… ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ (Π° Π½Π΅ сами строки).

Π—Π΄Π΅ΡΡŒ ΡΠ½ΠΈΠΌΠ°ΡŽΡ‚ΡΡ сразу Π΄Π²Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹: ΠΎΠ΄Π½Π° - связанная со ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ управлСния ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ, Π° вторая - с большими Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹ΠΌΠΈ расходами ΠΏΡ€ΠΈ пСрСстановках самих строк. ΠŸΡ€ΠΎΡ†Π΅ΡΡ сортировки распадаСтся Π½Π° Ρ‚Ρ€ΠΈ этапа:

Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ всСх строк ΠΈΠ· Π²Π²ΠΎΠ΄Π°

сортировка Π²Π²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… строк

ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ ΠΈΡ… ΠΏΠΎ порядку

Как ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, Π²Ρ‹Π΄Π΅Π»ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ СстСствСнному дСлСнию Π·Π°Π΄Π°Ρ‡ΠΈ, ΠΈ напишСм Π³Π»Π°Π²Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ main, ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΡƒΡŽ этими функциями. ΠžΡ‚Π»ΠΎΠΆΠΈΠΌ Π½Π° врСмя Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ этапа сортировки ΠΈ сосрСдоточимся Π½Π° структурС Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π²Π²ΠΎΠ΄Π΅-Π²Ρ‹Π²ΠΎΠ΄Π΅.

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²Π²ΠΎΠ΄Π° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈ Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ символы всСх строк, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ массив ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° строки. Она, ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΠΎΠ΄ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ число Π²Π²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… строк - эта информация понадобится для сортировки ΠΈ ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ. Π’Π°ΠΊ ΠΊΠ°ΠΊ функция Π²Π²ΠΎΠ΄Π° ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΌ числом строк, Ρ‚ΠΎ, Ссли ΠΈΡ… Π²Π²Π΅Π΄Π΅Π½ΠΎ слишком ΠΌΠ½ΠΎΠ³ΠΎ, ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π΄Π°Π²Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ совпадСт с количСством строк, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ -1.

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²Ρ‹Π²ΠΎΠ΄Π° занимаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅Ρ‚ строки, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ Π² Ρ‚ΠΎΠΌ порядкС, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ располоТСны ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° Π½ΠΈΡ… Π² массивС.