Використання рядків типу string

Раніше розглядалися питання обробки символьних даних мо­ви С++, у тому числі і символьних рядків. Однак в останніх вер­сіях мови С++, починаючи з С++4.5, введена стандартна бібліо­тека шаблонів — Standard Template Library (STL), яка містить клас string з більш потужними засобами обробки рядків.

Для підключення цього класу до програми слід записати ди­рективу:

#include <string> (без розширення .h)

і підключити простір імен бібліотеки шаблонів у вигляді

using namespace std; .

Після цього можна оголошувати змінні типу string:

    string strl, str2;.

Ініціювання рядків при оголошенні виконується одним із способів:

    string st1 = “Это строка класса string”; 
    string st2 (“Это другая строка класса string”);.
Оголошення покажчика на рядок здійснюється так:
    string *pst;.

Пам’ять для покажчика може бути виділена з будь-яким по­чатковим значенням за допомогою функції new, наприклад:
    string *pstr1 = new string; — оголошується порожній рядок,
    string *pstr2 = new string (“Новая строка”); — покажчик вказує на рядок «Новаястрока».

Раніше оголошеному покажчику *pst, який ні на що не вка­зує, можна присвоїти значення у вигляді
    pst = new string (“Это первая строка”);.

Значення рядка string містить будь-який набір символів, за­писаний у лапках.

Для рядків типу string визначено такі операції:

  • конкатенації (приєднання), котрі позначаються симво­лом «+»;
  • відношення («==», «!=», «>», «>=», «<», «<=»).

Наприклад, фрагмент
    string st1 = “Динамическая”; 
    string st2 = “память”; 
    string st3 = st1+’ ‘+st2; 
    cout << st3 << endl;
дозволить вивести на екран повідомлення: Динамическая память.

Для введення рядків string, крім операторів присвоювання, застосовують оператори введення даних:
    сіn >> st;
    cin.getline(st, siseof(st));
    getline(cin,st, ‘\n’); тощо.

Виведення рядків на екран здійснюється шляхом викорис­тання звичайних операторів виведення даних.

Рядки можна об’єднувати у масиви, які оголошуються зви­чайним засобом, тобто

    string sp[10]; — оголошення масиву, що містить 10 рядків.

Доступ до символів рядка здійснюється шляхом запису по­рядкового номера символа —індексу, який починається з нуля. Індекси можна записувати як у квадратних дужках, так і у зви­чайних, круглих.

Наприклад, якщо записати
    string str=”Moя строка”;,
то str[2] — це буде літера ‘я’.

Для масивів рядків потрібний символ визначається шляхом запису двох індексів: індексу елемента масиву та індексу сим­волу в цьому елементі, тобто у вигляді mas[i][j].

Існує багато функцій для обробки рядків типу string, роз­глянемо деякі з них.

Функції визначення довжини рядка:

  • str.size(); 
  • str.length();
  • str.max_size(); .

Наприклад:

//--------------------------- определение длины строки
#include <iostream.h>
#include <string>
using namespace std;
main() 
{ string str, st ="И вот сама пришла волшебница зима!"; 
  str =" волшебница";
  cout << "Длина строки str = " << str.size() << "Длина строки st = " << st.length() << endl;
}

Результат виконання:
Длина строки str =11 Длина строки st = 34

Функції додавання одного рядка або його частини до ін­шого рядка:

  • Str.append(st); — додає рядок st до кінця рядка srt;
  • Str.append(st,k,n); — додає до рядка str n символів ряд­ка st, починаючи з позиції k.

Наприклад:

//--------------- добавление строки
string str, st = "Substring in text";
str.append(st,3,6);
cout << "str = "<<str << endl;

Результат виконання:
str = string
Функція включення рядка в рядок:

  • str.insert(k,st) — вставляє в рядок str з позиції k рядок st;
  • str.insert(k1,st,k2,n) — вставляє в рядок str з позиції kl n символів рядка st,починаючи з позиції k2 в рядку st.

Наприклад:
// вставка подстроки в строку
string str, st = “string”;                        
str = “My text”;  
str.insert(3,st);  
cout << “str = “<< str << endl;        

Результат: str = My string text

string str, st = “string “;
str = “My text”;
str.insert(3,st,2,4);
cout << ” str = ” << str << endl;

Результат: str = My ring text

Функція вилучення символів із рядка:

  • str.remove(k,n) — вилучає n символів з рядка str, почи­наючи з позиції k.

Наприклад:
// удаление подстроки из строки
string str = “My text string”; 
str.remove(3,4);
cout << “str = “<< str << endl;

Результат виконання:
str = My string.
Функція заміни частини рядка або усього рядка:

  • str.replace(st) — заміняє рядок str на st;
  • str.replace(k,n,st) — заміняє в рядку str n символів, по­чинаючи з позиції k рядка st;
  • str.replace(kl,nl,st,k2,n2) — заміняє в рядку str nl сим­волів з позиції kl частиною вn2 символи рядка st, починаючи з позиції k2.

Наприклад:
// замена подстроки в строке
string str, st = “substring”;                 
str =”My text string”;                
str.replace(8,9,st); 
cout <<“str = “<< str<<endl;            

Результат виконання:
str = My text substring 

string str, st = ” substring”;

str=”My text long”; 
str.replace(3,5,st,l,3); 
cout <<” str = “<< str<<endl;   

Результат виконання:
str = My sublong
         
Функція обміну змістом двох рядків:

  • str.swap(st) — обмінює зміст рядків str та st.

Наприклад:
//————- обмен содержимым строк
string str, st=”Coлнечная погода”; 
str = “Дождливая погода”;
str.swap(st);
cout <<” str = “<<str<<” st = “<<st<<endl; 

Результат виконання:
str = Солнечная погода st = Дождливая погода.

Функція виділення частини рядка:

  • str.substr(k,n) — повертає частину рядка str в n симво­лів, починаючи з позиції k.

Наприклад:
//————- выделение части строки
string str, st;
str=”Moй текст string “;
st=str. substr(4,13);
cout << ” st = ” << st << endl;

Результат виконання:
st = текст string.

Функція пошуку позиції входження підрядка в рядок: 

  • str.find(st,k) — шукає зліва граничну позицію входжен­ня рядка st в рядок str,починаючи з k-ої позиції рядка str;
  • str.rfind(st,k) — шукає справа граничну позицію вход­ження рядка st в рядок str,починаючи з k-ої позиції рядка str.

Наприклад:
// позиция вхождения подстроки в строку
string str, st=”nopa”;                              
str=”Oceнняя пора – дождливая пора!”          
int p=str.find(st,0);
cout <<” p=”<<p<<endl; 

Результат виконання:
р=8.
string str, st=”nopa”;
str=”Oceнняя пора – дождливая пора!”
int p=str.rfind(st,str.length);
cout <<” p=”<<p<<endl;
Результат виконання:
р=25.

Функція присвоювання усього рядка або його частини ін­шому рядку:

  • str.assign(st) — присвоює весь рядок st типу string або масив char[ ] — рядку str типу string;
  • str.assign(st,k,n) — присвоює n символів рядка st рядку str, починаючи з k-ої позиції.

Ці функції можна використовувати для перетворення рядка типу char у рядок string.Наприклад:
//————————– присваивание строк
char st[ ]=”Пришло жаркое лето!”; 
string str;
cout<<” str = “<< str.assign(st,7,12)<<endl; 

Результат виконання:
str = жаркое лето!

або
string str, st=”O, лето красное, любил бы я тебя!”;
cout<<“str = “<< str.assign(st,3,12) << endl;

Результат виконання:
str = лето красное.
Функція порівняння рядків або їхніх частин:

  • str.compare(st) — порівнює рядки st та str і повертає зна­чення:

<0 — якщо st < str;
=0 — якщо st = str;
>0 — якщо st > str;;

  • str.compare(st,k,n) — порівнює n символів рядка st з ряд­ком str, починаючи з k-ої позиції. Наприклад:

//————— сравнение частей строк
string str, st=”oв”;
str=”Иванов”; 
if (str.compare(st,4,2)==0) 
cout<<“str= “<< str << endl;
Результат виконання:
str = Иванов.
Функція перетворення рядка типу string у рядок типу char:

  • str.c_str() — перетворює рядок типу string у рядок типу char.

Розглянемо приклади використання наведених функцій при обробці рядків типу string.

Приклад 7.9. Увести до пам’яті комп’ютера будь-який текст, від­окремити в ньому всі слова, вивести їх на екран та визначити найдов­ше слово

// Р7 9.СРР — выделить слова в тексте и найти среди них наибольшее
#include <iostream>
#include <string>
#include <conio.h>
using namespace std;
main ()string txt, s1, s1max;          // shnax — наибольшее слово
  int і, k=0, n=0, max=0;
//---------------- ввод текста
 cout <<"***** Enter text\n";
  getline(cin,txt,'\n');
  for (i = 0; і <= txt.length()-l; i++) 
  { if ((txt[i]==' ') || (txt[i]==',') || (txt[i]=='.'))
  {n++;   // n — счетчик пропусков и знаков препинания    
      if (n>1) continue; k++;   //k — счетчик слов    
      cout<< k <<" slovo - "<< s1<<" = "<<s1.size() << " simbols\n"; 
//--------------- определение слова с наибольшим количеством символов
 if (sl.size() > max) 
      { max = sl.size(); 
        slmax=sl; }     
      sl="";    //освобождение sl для формирования слова
} 
  else {n=0; sl=sl+txt[i]; } //переменная s1 — формирует слово
  }
  cout<<"\nslmax — "<< slmax<<" = "<<slmax.size()<<" simbols\n"; 
  getch ();
}

Результати обчислень:
***** Enter text
Учитель, воспитай ученика, чтобы было у кого учиться.
1   slovo — Учитель = 7 simbols
2   slovo — воспитай = 8 simbols
3   slovo — ученика = 7 simbols
4   slovo — чтобы = 5 simbols 
5   slovo — было = 4 simbols
6   slovo — у = 1 simbols
7   slovo — кого = 4 simbols
8   slovo — учиться = 7 simbols
slmax — воспитай = 8 simbols.

У програмі текст вводиться за допомогою функції getline() (зверніть увагу на її вигляд), слова виділяються не з викорис­танням функцій, а шляхом конкатенації символів, якщо вони не є символами-роздільниками.
Приклад 7.10. Увести список прізвищ і відсортувати його за ал­фавітом

// Р7_10.СРР — сортировка фамилий по алфавиту
#include <iostream.h>
#include <string>
#include <conio.h>
using namespace std;
main() 
{ const n=5;
  string spis[n];
  int i, k;
//--------------------------- ввод списка фамилий
  for(i = 0; і < n; i++)
  { cout<<"*"** Enter "<<(i+l)<<" name\n";
    getline(cin,spis[i],'\n');  }
//--------------------------- сортировка списка фамилий
  for (k = 1; k < n; k++)   
    for (і = 0; і < n-k; i++)    
    if (spis[i] > spis[i+l]) spis[i].swap(spis[i+l]);
//--------------------------- вывод отсортированного списка
 cout<<"\n***** Rezult spisok\n";  
  for(i = 0; і < n; i++) 
  cout << (i+1) << ' ' << spis[i] << endl;   
  getch ();
}

Результати виконання:
***** Enter 1 name 
Котин С. Б.
***** Enter 2 name 
Бобров М. Т.
***** Enter 3 name 
Авдеев P. Л.
***** Enter 4 name 
Попов Г. Д.
***** Enter 5 name 
Елкин П. P.
***** Rezult spisok
1   Авдеев P. Л.
2   Бобров M. Т.
3   Елкин П. Р.
4   Котин С. Б.
5   Попов Г. Д.

Для порівняння прізвищ у програмі використовується зви­чайна операція «>», а для взаємозаміни — функція swap() (про­аналізуйте програми прикладу 7.10 і прикладу 7.4).

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *