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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «Освой ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Π‘++ Π·Π° 21 дСнь.Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 77

Автор ДТСсс Π›ΠΈΠ±Π΅Ρ€Ρ‚ΠΈ

char Greeting[ ] = { 'H' , 'e' , ' 1' , 'Π“ , 'o' , ' ' , 'W' , 'o' , 1 r' , '1' , 'd' , 1 \0' };

Π’ послСдний элСмСнт массива заносится Π½ΡƒΠ»Π΅Π²ΠΎΠΉ ΠΊΠΎΠ½Ρ†Π΅Π²ΠΎΠΉ символ строки (\0), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ C++ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°ΡŽΡ‚ ΠΊΠ°ΠΊ символ Ρ€Π°Π·Ρ€Ρ‹Π²Π° строки. Π₯отя ΠΌΠ΅Ρ‚ΠΎΠ΄ Π²Π²ΠΎΠ΄Π° строки тСкста Π² массив символ Π·Π° символом Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ, это довольно ΡƒΡ‚ΠΎΠΌΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°, чрСватая ошибками. К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, C++ допускаСт ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π²Π²ΠΎΠ΄Π° строк тСкста Π² массивы:

char Greeting[] = "hello world";

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π΄Π²Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° Π΄Π°Π½Π½ΠΎΠ³ΠΎ синтаксиса.

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

β€’ ΠΠ΅Ρ‚ нСобходимости Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΊΠΎΠ½Ρ†Π΅Π²ΠΎΠΉ Π½ΡƒΠ»Π΅Π²ΠΎΠΉ символ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ компилятор сдСлаСт это автоматичСски.

Π‘Ρ‚Ρ€ΠΎΠΊΠ° Hello World Π·Π°ΠΉΠΌΠ΅Ρ‚ 12 Π±Π°ΠΉΡ‚. ΠŸΡΡ‚ΡŒ Π±Π°ΠΉΡ‚ΠΎΠ² ΠΏΠΎΠΉΠ΄Π΅Ρ‚ Π½Π° слово Hello, ΠΏΡΡ‚ΡŒ Π½Π° слово World ΠΈ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ Π±Π°ΠΉΡ‚Ρƒ Π½Π° ΠΏΡ€ΠΎΠ±Π΅Π» ΠΈ ΠΊΠΎΠ½Ρ†Π΅Π²ΠΎΠΉ Π½ΡƒΠ»Π΅Π²ΠΎΠΉ символ.

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ строкового массива ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π½Π° ΠΏΠΎΡ‚ΠΎΠΌ. ΠŸΡ€ΠΈ этом, Ρ‚Π°ΠΊΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ массивами, Π½ΡƒΠΆΠ½ΠΎ ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Ρ‚Π΅ΠΌ Π² массив Π½Π΅ Π±Ρ‹Π»ΠΎ записано символов большС, Ρ‡Π΅ΠΌ ΠΎΡ‚Π²ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ для этого мСста.

Π’ листингС 12.8 ΠΏΠΎΠΊΠ°Π·Π°Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования массива символов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ инициализируСтся строкой, Π²Π²ΠΎΠ΄ΠΈΠΌΠΎΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ с ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹.

Листинг 12.8. Π—Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ массива символами

1: //Листинг 12.8. Π—Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ массива символами

2:

3: #include <iostream.h>

4:

5: int main()

6: {

7:    char buffer[80];

8:    cout << "Enter the string: ";

9:    cin >> buffer;

10:   cout << "Here is' the buffer: " << buffer << endl;

11:   return 0;

12: }


Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

Enter the string: Hello World

Here's the buffer: Hello


Анализ: Π’ строкС 7 ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ массив buffer, рассчитанный Π½Π° 80 символов. TaΠΊΠΎΠΉ массив ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ строку ΠΈΠ· 79 Π±ΡƒΠΊΠ², Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹, плюс Π½ΡƒΠ»Π΅Π²ΠΎΠΉ ΠΊΠΎΠ½Ρ†Π΅Π²ΠΎΠΉ символ строки.

Π’ строкС 8 ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ прСдлагаСтся ввСсти строку тСкста, которая копируСтся Π² массив buffer Π² строкС 9. ΠœΠ΅Ρ‚ΠΎΠ΄ cin автоматичСски Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ Π½ΡƒΠ»Π΅Π²ΠΎΠΉ ΠΊΠΎΠ½Ρ†Π΅Π²ΠΎΠΉ символ Π² ΠΊΠΎΠ½Ρ†Π΅ Π²Π²Π΅Π΄Π΅Π½Π½ΠΎΠΉ строки.

Но ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ Π² листингС 12.8, Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ряд ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Ссли ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Π²Π΅Π΄Π΅Ρ‚ строку, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ Π±ΠΎΠ»Π΅Π΅ 79 символов, Ρ‚ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ cin Π²Π²Π΅Π΄Π΅Ρ‚ ΠΈΡ… Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Π°ΠΌΠΈ массива, Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ cin воспринимаСт ΠΏΡ€ΠΎΠ±Π΅Π» ΠΊΠ°ΠΊ ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠ΅ строки, послС Ρ‡Π΅Π³ΠΎ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π°Π΅Ρ‚ Π²Π²ΠΎΠ΄ Π΄Π°Π½Π½Ρ‹Ρ….

Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ эти ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ get(), примСняСмый вмСстС с ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ cin: cin,get(). Для выполнСния ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π½ΡƒΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ Ρ‚Ρ€ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°.

β€’ Π‘ΡƒΡ„Π΅Ρ€ Π²Π²ΠΎΠ΄Π°.

β€’ ΠœΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ число символов.

β€’ Π Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ символ прСрывания Π²Π²ΠΎΠ΄Π°.

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π² качСствС Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ задаСтся символ Ρ€Π°Π·Ρ€Ρ‹Π²Π° строки. ИспользованиС этого ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² листингС 12.9.

Листинг 12.9. Π—Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ массива

1: //Листинг 12.9. ИспользованиС ΠΌΠ΅Ρ‚ΠΎΠ΄Π° cin.get()

2:

3: #include <iostream.h>

4:

5: int main()

6: {

7:    char buffer[80];

8:    cout << "Enter the string: ";

9:    cin.get(buffer, 79); // Π²Π²ΠΎΠ΄ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ послС 79 символа ΠΈΠ»ΠΈ символа Ρ€Π°Π·Ρ€Ρ‹Π²Π° строки

10:   cout << "Here's the buffer: " << buffer << endl;

11:   return 0;

12: }


Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

Enter the string: Hello World

Here's the buffer: Hello World


Анализ: Π’ строкС 9 осущСствляСтся Π²Ρ‹Π·ΠΎΠ² ΠΌΠ΅Ρ‚ΠΎΠ΄Π° cin.get(). Π‘ΡƒΡ„Π΅Ρ€ Π²Π²ΠΎΠ΄Π°, Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ Π² строкС 7, пСрСдаСтся Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚. Π’Ρ‚ΠΎΡ€ΠΎΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π·Π°Π΄Π°Π΅Ρ‚ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ Π΄Π»ΠΈΠ½Ρƒ строки, Ρ€Π°Π²Π½ΡƒΡŽ 79 символам. ДопускаСтся Π²Π²ΠΎΠ΄ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ 79 символов, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ послСдний элСмСнт массива отводится Π½Π° ΠΊΠΎΠ½Ρ†Π΅Π²ΠΎΠΉ Π½ΡƒΠ»Π΅Π²ΠΎΠΉ символ строки. Π£ΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ. Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв Π² качСствС Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ символа ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ Π·Π°Π΄Π°Π²Π°Π΅ΠΌΡ‹ΠΉ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ символ Ρ€Π°Π·Ρ€Ρ‹Π²Π° строки.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ strcpy() ΠΈ strncpy()

Π―Π·Ρ‹ΠΊ C++ унаслСдовал ΠΎΡ‚ Π‘ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°Π΄ строками. Π‘Ρ€Π΅Π΄ΠΈ мноТСства доступных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π΅ΡΡ‚ΡŒ Π΄Π²Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡŽΡ‚ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ΄Π½ΠΎΠΉ строки Π² Π΄Ρ€ΡƒΠ³ΡƒΡŽ. Π­Ρ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ strcpy() ΠΈ strncpy(). Ѐункция strcpy() ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ строку Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ Π² ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Π±ΡƒΡ„Π΅Ρ€, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² листингС 12.10.

Листинг 12.10. ИспользованиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ strcpy()

1: #include <iostream.h>

2: #include <string.h>

3: int main()

4: {

5:    char String1[] = "No man is an island";

6:    char String2[80];

7:

8:    strcpy(String2,String1);

9:

10:   cout << "String1: " << String1 << endl;

11:   cout << "String2: " << String2 << endl;

12:   return 0;

13: }


Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

String1: No man is an island

String2: No man is an island


Анализ: Π€Π°ΠΉΠ» Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° string.h Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π² строкС 2. Π­Ρ‚ΠΎΡ‚ Ρ„Π°ΠΉΠ» содСрТит ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ strcpy(). Π’ качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π΄Π²Π° массива символов, ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… являСтся Ρ†Π΅Π»Π΅Π²Ρ‹ΠΌ, Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ β€” массивом источника Π΄Π°Π½Π½Ρ‹Ρ…. Если массив-источник окаТСтся большС Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ массива, Ρ‚ΠΎ функция strcpy() Π²Π²Π΅Π΄Π΅Ρ‚Π΄Π°Π½Π½Ρ‹Π΅ Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ массива.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅Π΄ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½ΡƒΡŽ ΠΎΡˆΠΈΠ±ΠΊΡƒ, Π² этой Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ содСрТится Π΅Ρ‰Π΅ ΠΎΠ΄Π½Π° функция копирования строк: strncpy(). Π­Ρ‚Π° функция ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ ряд символов, Π½Π΅ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°ΡŽΡ‰ΠΈΠΉ Π΄Π»ΠΈΠ½Ρ‹ строки, Π·Π°Π΄Π°Π½Π½ΠΎΠΉ Π² Ρ†Π΅Π»Π΅Π²ΠΎΠΌ массивС. Ѐункция strncpy() Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, Ссли Π΅ΠΉ повстрСчаСтся символ Ρ€Π°Π·Ρ€Ρ‹Π²Π° строки. ИспользованиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ strncpy() ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² листингС 12.11.

Листинг 12.11. ИспользованиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ strncpy() 

1: #include <iostream.h>

2: #include <string.h>

3: int main()

4: {

5:    const int MaxLength = 80;

6:    char String1[] = "No man is an island";

7:    char String2[MaxLength+1];

8:

9:

10:   strncpy(String2,String1,MaxLength);

11:

12:   cout << "String1: " << String1 << endl;

13:   cout << "String2: " << String2 << endl;

14:   return 0;

15: }


Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

String1: No man is an island

String2: No man is an island


Анализ: Π’ строкС 10 ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° вмСсто Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ strcpy() ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ strncpy(), Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ MaxLength ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π·Π°Π΄Π°Π΅Ρ‚ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ Π΄Π»ΠΈΠ½Ρƒ ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΉ строки. Π Π°Π·ΠΌΠ΅Ρ€ массива String2 Π·Π°Π΄Π°Π½ ΠΊΠ°ΠΊ MaxLength+1. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ элСмСнт потрСбовался для ΠΊΠΎΠ½Ρ†Π΅Π²ΠΎΠ³ΠΎ Π½ΡƒΠ»Π΅Π²ΠΎΠ³ΠΎ символа строки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ добавляСтся автоматичСски ΠΎΠ±Π΅ΠΈΠΌΠΈ функциями β€” strcpy() ΠΈ strncpy().

ΠšΠ»Π°ΡΡΡ‹ строк

МногиС компиляторы C++ содСрТат Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ классов, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ. Одним ΠΈΠ· прСдставитСлСй встроСнных классов являСтся класс String.

Π―Π·Ρ‹ΠΊ C++ унаслСдовал ΠΎΡ‚ Π‘ ΠΊΠΎΠ½Ρ†Π΅Π²ΠΎΠΉ Π½ΡƒΠ»Π΅Π²ΠΎΠΉ символ окончания строки ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ строковых Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΡƒΠ΄Π° Π²Ρ…ΠΎΠ΄ΠΈΡ‚ функция strcpy(). Но всС эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ. Класс String ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Π½Π°Π±ΠΎΡ€ встроСнных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ-Ρ‡Π»Π΅Π½ΠΎΠ² ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…-Ρ‡Π»Π΅Π½ΠΎΠ², Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² доступа, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ автоматичСски Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ, связанныС с ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ тСкстовых строк, получая ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

Если Π² вашСм компиляторС Π½Π΅Ρ‚ встроСнного класса String, Π° ΠΈΠ½ΠΎΠ³Π΄Π° ΠΈ Π² Ρ‚Π΅Ρ… случаях, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ Π΅ΡΡ‚ΡŒ, Π±Ρ‹Π²Π°Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ собствСнный класс Ρ€Π°Π±ΠΎΡ‚Ρ‹ со строками. Π”Π°Π»Π΅Π΅ Π² этой Π³Π»Π°Π²Π΅ рассматриваСтся ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° создания ΠΈ примСнСния класса String ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… классов Ρ€Π°Π±ΠΎΡ‚Ρ‹ со строками.

Как ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ, класс String Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€Π΅ΠΎΠ΄ΠΎΠ»Π΅Ρ‚ΡŒ ограничСния, свойствСнныС использованию массивов символов. Подобно Π΄Ρ€ΡƒΠ³ΠΈΠΌ массивам, массивы символов статичны. Π’Π°ΠΌ приходится Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈΡ… Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΡ€ΠΈ объявлСнии ΠΈΠ»ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. Они всСгда Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ всС ΠΎΡ‚Π²Π΅Π΄Π΅Π½Π½ΠΎΠ΅ для Π½ΠΈΡ… пространство памяти, Π΄Π°ΠΆΠ΅ Ссли Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎ- Π»ΠΎΠ²ΠΈΠ½Ρƒ элСмСнтов массива. Π—Π°ΠΏΠΈΡΡŒ Π΄Π°Π½Π½Ρ‹Ρ… Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ массива Π²Π΅Π΄Π΅Ρ‚ ΠΊ катастрофС.

Π₯ΠΎΡ€ΠΎΡˆΠΎ написанный класс Ρ€Π°Π±ΠΎΡ‚Ρ‹ со строковыми Π΄Π°Π½Π½Ρ‹ΠΌΠΈ выдСляСт ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ памяти, сколько Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ для Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ сСанса Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ, ΠΈ всСгда прСдусматриваСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ добавлСния Π½ΠΎΠ²Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. Если с Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΠΌ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ памяти Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, прСдусмотрСны элСгантныС ΠΏΡƒΡ‚ΠΈ ΠΈΡ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования класса String ΠΏΠΎΠΊΠ°Π·Π°Π½ Π² листингС 12.12.

Листинг 12.12. ИспользованиС класса String

1: // Листинг. 12.12

2:

3: #include <iostream.h>

4: #include <string.h>

5:

6: // Π ΡƒΠ΄ΠΈΠΌΠ΅Π½Ρ‚Π°Ρ€Π½Ρ‹ΠΉ класс string

7: class String

8: {

9:    public:

10:      // ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€Ρ‹

11:      String()

12:      Stnng(const char *const),

13:      Stnng(const String &),

14:      ~Stnng()

15:

16:      // ΠŸΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹

17:      char & operator[](unsigned short offset),

18:      char operator[](unsigned short offset) const,

19:      Stnng operator+(const String&),

20:      void operator+=(const String&)

21:      Stnng & operator= (const Stnng &),

22:

23:      // ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ доступа

24:      unsigned short GetLen()const { return itsLen, }

25:      const char * GetStnng() const { return itsStnng, }

26:

27:  private:

28:     Stnng (unsigned short), // Π—Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ конструктор

29:     char * itsStnng,

30:     unsigned short itsLen