РОБОТА З РЯДКАМИ|
Мета. Отримати тримати практичні навички навички роботи з рядками на С++.
Короткі теоретичні відомості
У С/С++ рядок символів розглядають|розглядується| як звичайний|звичний| масив символів, в якому останнім йде|прямує| символ закінчення рядка ‘\0’ . При цьому довжина масиву визначається на одиницю більше ніж довжина реального рядка.
Функції оброблення рядків описано|перебувають| у модулі string.h. (основні з|із| них див. у додатку А)|посібнику|.
Слід зазначити, що рядок можна розглядати як єдине ціле, а можна використовувати як звичайний масив символів. У останньому випадку необхідно враховувати, що будь - який рядок має завершуватися нульовим символом. Усі функції модуля string.h ураховують останній нульовий символ рядка автоматично.
Наприклад. Необхідно ввести|запровадити| послідовність рядків довільної довжини і вивести їх на екран.
#include<iostream.h>
#include<string.h>
#include<conio.h>//містить прототипи функцій clrscr() і getch()
#include<process.h>//містить прототип функції exit()
void main()
{ clrscr();
char* str_temp=new char[255]; /* визначаємо буферний рядок, який може містити максимальну кількість символів */
char** m_str;
int i,j,n;
cout<<"\n Уведіть кількість рядків ";
cin>>n;
m_str=new char*[n]; /* розподіляємо пам'ять під зберігання адреси кожного
рядка, що вводять|запроваджується|. Якщо оператор new повертає як адресу NULL, то повідомляємо користувача про помилку і припиняємо роботу функції main() */
if(!m_str){ cerr<<"\n Помилка під час розподілу пам’яті";
exit(1);}
cin.ignore(); /* функція-член класу cin, яка ігнорує за умовчанням код символа “Enter”, який було натиснуто під час уведення кількості рядків. Функція має два параметри (int, char) – кількість символів ігнорування і символ, який стоїть у кінці|у кінці,наприкінці| цієї послідовності */
for(i=0;i<n;i++)
{ cout<<"\n Уведіть "<<i+1<<"-ий рядок ";
cin.getline(str_temp,255); /* функція-член класу cin, яка дозволяє занести
символи з вхідного потоку до змінної str_temp. Другий параметр визначає максимальну довжину рядка.*/
m_str[i]=new char[strlen(str_temp)+1]; /* розподіляємо пам'ять під зберігання рядка, що вводиться|запроваджується| за допомогою буферного рядка. Оскільки функція strlen() визначає довжину рядка без урахування символа нуля, то додаємо|добавляємо| 1 до реального значення довжини рядка, резервуючи місце для символа завершення рядка */
if(!m_str[i]){ cerr<<"\n Помилка під час розподілу пам’яті ";
exit(1);}
strcpy(m_str[i],str_temp);}
delete[] str_temp; // звільняємо пам’ять, яку було зайнято буферним рядком
cout<<"\n Масив рядків, який введено\n";
for(i=0;i<n;i++)
{ cout<<m_str[i]<<endl; //виводимо рядок на екран
delete[] m_str[i];} /* звільняємо пам’ять, яка була зайнята під рядок, що виведено на екран */.
delete[] m_str; /*звільняємо пам’ять, яку було зарезервовано під зберігання масиву адрес рядків */
getch();
}