You are on page 1of 12

Використання функцій по роботі з рядками

Символ — найменша складова тексту. Наприклад, літера латиниці, кирилиці, цифра


десяткового запису, знак пунктуації тощо.
У мові програмування С++ передбачено використання символьних величин.

Символьна величина — це величина типу char для збереження (цілочисельного) коду


символу.

У таблиці ASCII подано написання символів і їхні коди.

Значення символьної величини записують як символ в одинарних лапках, наприклад, 'a'.

Рядок у мові С++ подають (як один з варіантів) масивом елементів типу char, що


закінчуються нуль-термінатором '\0'.

Такі рядки називають С рядками або рядками в стилі С. Вони мають тип char *. Назва рядка
є сталим покажчиком на перший символ. Значення рядка записують у подвійних лапках. При
оголошенні такого рядка необхідно враховувати наявність у кінці рядка нуль-термінатора,
тобто відводити додатковий байт під нього.

При ініціалізації початковим значенням довжину рядка буде визначено автоматично, а в


кінець рядка буде додано нуль-термінатор. При спробі вивести нуль-термінатор буде
продубльовано попередній символ — див. приклад коду

#include <iostream>
#include <string>
using namespace std;
int main()
{ char c ='a',
s[10] = "123456789"; // при s[9] буде помилка компіляції
char * t="abcdefghi";
cout<<c<<'*'<<endl<<s<<endl<<t<<endl<<">"<<t[10]<<"<";
}
та результату його роботи.
a*
123456789
abcdefghi
>><
Функції для роботи з символами і рядками char *
бібліотека cstring
 strlen(s) — повертає довжину рядка s без урахування нуль-символу;
 strcpy(s,t) — копіювання символів з рядка t в рядок s;
 strncpy(s,t,n) — копіювання n символів з рядка t в рядок s, повертає s;
 strcat(s,t) — зберігає в s результат об'єднання рядків s і t;
 strncat(s,t,n) — зберігає в s результат об'єднання рядка s і n символів рядка t;
 strcmp(s,t) — порівнює з урахуванням регістру рядки s і t, повертає ціле значення типу
int:
o 0, якщо рядки збігаються;
o від'ємне, якщо s < t;
o додатне, якщо s > t.
 strncmp(s,t,n) — аналогічно strcmp порівнює n символів рядка s з рядком t;
 isalnum(c) — повертає ненульове ціле значення, якщо c — літера або цифра, інакше
— false;
 isalpha(c) — повертає ненульове ціле значення, якщо c — літера, інакше — false;
 isdigit(c) — повертає ненульове ціле значення, якщо c — цифра, інакше — false;
 isblank(c) — повертає ненульове ціле значення, якщо c — пробіл, інакше — false;
 iscntrl(c) — повертає ненульове ціле значення, якщо c — символ керування, інакше
— false;
 isgraph(c) — повертає ненульове ціле значення, якщо c — друкований символ, інакше
— false;
 islower(c) — повертає ненульове ціле значення, якщо c — літера нижнього регістру,
інакше — false;
 isprint(c) — повертає ненульове ціле значення, якщо c — друкований символ, інакше
— false;
 ispunct(c) — повертає ненульове ціле значення, якщо c — знак пунктуації, інакше
— false;
 isspace(c) — повертає ненульове ціле значення, якщо c — пробіл, інакше — false;
 isupper(c) — повертає ненульове ціле значення, якщо c — літера верхнього регістру,
інакше — false;
 isxdigit(c) — повертає ненульове ціле значення, якщо c — 16-кова цифра, інакше
— false;
 strchr(s,c) — пошук першого входження символу c у рядку s. У разі вдалого пошуку
повертає покажчик на місце першого входження символу с. Вказівка:

cout<<strchr(s,c);

виводить рядок s, починаючи з цього першого входження. Якщо символ не знайдено, то


буде повернуто NULL;
 strcspn(s,t) — повертає довжину початку s, що не містить символів t;
 strspn(s,t) — повертає довжину початку s, що містить лише символи t;
 strprbk(s,t) — повертає покажчик першого входження будь-якого символу рядка t в
рядок s. Вказівка:

cout<<strpbrk(s,t);

виводить рядок s, починаючи з цього першого входження. Якщо символ не знайдено, то


буде повернуто NULL;
 toupper(c) — якщо символ c — маленька літера латиниці, то функція відповідну велику
літеру, інакше — символ без змін — див. код
 #include <iostream>
 #include <cstring>
 #include <cstdio>
 using namespace std;
 int main()
 { char s[] ="little letters маленькі літери 123";
 for (int j=0; j<strlen(s); j++) putchar(toupper(s[j]));
 return 0;
}
та результат її дії

LITTLE LETTERS маленькі літери 123


бібліотека cstdlib
 atof(s) — перетворює рядок s у тип double;
 atoi(s) — перетворить рядок s у тип int;
 atol(s) — перетворить рядок s у тип long;

бібліотека stdio.h
 getchar() — повертає символ, зчитаний зі стандартного потоку введення;
 putchar(с) — виводить символ с у стандартний потік виведення.
Примітка. Оператор cout зчитує рядок до перших пробілу або ознаки кінця рядка. Для
зчитування рядків, що містять пробіли використовують додаткові засоби мови С++.
Наприклад, наступну функцію.

Функція getline призначена для введення даних з потоку до деякого роздільника, який не


записують в отриманий масив даних. Виклик функції виглядає так:

cin.getline(s,n,d);

де s — зчитаний рядок типу char *, n — найбільша кількість символів, яку можна записати в
рядок, d — роздільник, який вказує на кінець зчитуваного рядка. Останній параметр функції
можна опустити. У цьому випадку буде використано роздільник як усталено '\n',
породжуваний натисканням клавіші Enter. Подамо приклад застосування цієї функції для
зчитування рядка до знаку оклику з можливо кількома символами '\n', породженими
натисканням клавіші Enter.
#include <iostream>
using namespace std;
int main ()
{ char s[99];
cout <<"Введіть рядок, який завершується знаком оклику '!'"<< endl;
cin.getline (s,99,'!');
cout<<s;
}
Потоком введення може бути і зчитування з файлу.
#include <iostream>
#include <fstream>
using namespace std;
int main ()
{ char s[99];
ifstream f;
f.open("input.txt");
f.getline (s,99,'!');
cout<<s;
}
Функція getline має ще один варіант застосування — до рядкової змінної необмеженої
довжини типу string, опис якої подано далі:

getline (f, s, d);

де f — потік даних, s — змінна для запису рядка, d — роздільник, який вказує на кінець
рядка. Останній параметр функції можна не вказувати. У цьому випадку буде використано
роздільник як усталено '\n'. Подамо приклад застосування цієї функції.
#include <string>
#include <iostream>
using namespace std;
int main()
{ string s;
cout <<"Введіть рядок, який завершується знаком оклику '!'"<< endl;
getline (cin,s,'!');
cout<<s;
}
Клас string було запроваджено як альтернативу типу char * для роботи з рядками. Щоб
скористатися наявними можливостями цього класу, потрібно підключити бібліотеку string і
простір назв std:
#include <string>
using namespace std;
Оголошення змінної типу string здійснюють традиційно для С++ з можливою
ініціалізацією.
string s;
string t = "оголошення з ініціалізацією";
Переваги типу string у порівнянні з типом char *
 можливість опрацювання рядків стандартними операторами C++ (=, +, == тощо);
 забезпечення кращої надійності програмного коду. Наприклад, при копіюванні рядків,
коли рядок-джерело має більший розмір ніж рядок-приймач;
 використання рядка як самостійного типу даних для забезпечення несуперечливості
даних.
Недолік типу string в порівнянні з типом char * — сповільнення швидкості опрацювання
даних внаслідок того, що тип string — це контейнерний клас, робота з яким вимагає
додаткових дій, прописаних у бібліотеці string.

Cтандартні (перевантажені) оператори класу string


тлумачення
= надання значення
+ конкатенація (дописування)
+= надання значення з конкатенацією
== рівність (порівняння)
!= нерівність
< менше
<= не перевищує (менше або дорівнює)
> більше
>= не менше (більше або дорівнює)
[] індексація (як для масиву)
Приклади ініціалізації змінних типу string
string s1 ("Привіт!");
string s2 = "Привіт!";
char * ps = "Привіт!";
string s3 (ps);
string s4 (s3);
string s5;
Надання значень змінним типу string можна здійснити:
 або використавши оператор =;
 або використавши функцію assign з класу string.
Функція assign має кілька реалізацій:
 assign(s) — надання значення рядка s;
 assign(s,j,n); — копіювання n символів з рядка s, починаючи з символа з номером j;
 assign(p,n); — копіювання перших n символів з рядка p типу char *.
Наступна частина коду подає приклади застосування цих реалізацій у порядку переліку:
string s0 = "abcdefgh", s1,s2,s3;
char * p = "abcdefgh";
s1.assign(s0); // s1 = "abcdefgh"
s2.assign(s0, 5, 2); // s2 = "fg"
s3.assign(p, 5); // s3 = ""abcde"
Функція append — дописування у кінець рядка — має такі варіанти реалізації:
 функція отримує посилання на рядок s, який додають (дописують) до об'єкту, що її
викликає;
 функція отримує покажчик на рядок типу const char *, яка завершується символом '\ 0'
— див. наступний код, у якому в коментарях записано результат виведення:
#include <iostream>
#include <string>
using namespace std;
int main()
{ string s0= "abc", s,
t = "0123456";
char * p = "0123456";
s=s0; s.append(t); cout<<s<<endl; // abc0123456
s=s0; s.append(t,2,3); cout<<s<<endl; // abc234
s=s0; s.append(p); cout<<s<<endl; // abc0123456
s=s0; s.append(p,2); cout<<s<<endl; // abc01
s=s0; s.append(p,2,3); cout<<s<<endl; // abc234
return 0;
}
Функція insert — надає можливість вставити у задану позицію рядка інший рядок
повністю або лише частину — див. наступний код, у якому в коментарях записано результат
виведення:
#include <iostream>
#include <string>
using namespace std;
int main()
{ string s = "abcdef",
t = "123456";
s.insert(4, t); cout<<s<<endl; // abcd123456ef
s.insert(2, t, 2, 4); cout<<s<<endl; // ab3456cd123456ef
return 0;
}
Функція replace виконує заміну символів одного рядка на інший або лише його частину.
Перші два аргументи задають діапазон замінюваної частини — з якого індексу і якої
довжини. Третій аргумент — рядок, на який або частину якого буде здійснено заміну.
Четвертий і п'ятий (якщо їх записано) — діапазон частини третього аргумента, на який буде
здійснено заміну — див. наступний код, у якому в коментарях записано результат виведення:
#include <iostream>
#include <string>
using namespace std;
int main()
{ string t = "abcdef",
s,s0 = "0123456";
s=s0; s.replace (2,3,t); cout<<s<<endl; // 01abcdef56
s=s0; s.replace (2,6,t); cout<<s<<endl; // 01abcdef
s=s0; s.replace (7,4,t); cout<<s<<endl; // 0123456abcdef
s=s0; s.replace (2,7,t); cout<<s<<endl; // 01abcdef
s=s0; s.replace (2,3,t,3,2); cout<<s<<endl; // 01de56
s=s0; s.replace (2,3,t,3,7); cout<<s<<endl; // 01def56
return 0;
}
Функція clear видаляє всі символи з рядка.
#include <iostream>
#include <string>
using namespace std;
int main()
{ string s = "0123456789";
s.clear();
cout << ">" << s << "<" << endl; // ><
return 0;
}
Функція erase видаляє символи з рядка. Вона має два аргументи: індекс (позиція), починаючи
з якої потрібно видалити, і кількість символів, які видаляють. Якщо ці аргументи не вказано,
то буде видалено усі символи — див. наступний код, у якому в коментарях записано
результат виведення:
#include <iostream>
#include <string>
using namespace std;
int main()
{ string s = "0123456789";
s.erase (3, 5); cout<<s<<endl; // 01289
s.erase (); cout<<s<<endl; //
return 0;
}
Функції find і rfind повертають індекс позиції першого входження рядка-аргумента у даний
рядок, починаючи з даного індекса-аргумента. Функції відрізняються напрямком пошуку:
 від початку до кінця — функцією find;
 від кінця до початку — функцією rfind.
У разі відсутності відповідного входження функції буде повернуто число за межами
діапазону значень індексів елементів рядка, у якому здійснюють пошук. Пишуть, що буде
повернуто –1, але буває інакше — див. наступний код, у якому в коментарях записано
результат виведення:
#include <iostream>
#include <string>
using namespace std;
int main()
{ string s = "01234567890123456789",
t = "345",
u = "abcd";
cout<<s.find(t)<<endl; // 3
cout<<s.find(t,5)<<endl; // 13
cout<<s.find(t,15)<<endl; // 18446744073709551615
cout<<s.find(u)<<endl; // 18446744073709551615

cout<<s.rfind(t)<<endl; // 13
cout<<s.rfind(t,9)<<endl; // 3
cout<<s.rfind(t,2)<<endl; // 18446744073709551615
cout<<s.rfind(u)<<endl; // 18446744073709551615
return 0;
}
Функція find_first_of(t,j) повертає індекс першої появи будь-якого з символів
рядка t, починаючи позиції j. Якщо значення j не вказано, то вважають, що воно дорівнює 0,
тобто пошук здійснюють з початку рядка.

Функція find_last_of(t,j) повертає індекс останньої появи будь-якого з символів


рядка t, починаючи позиції j. Якщо значення j не вказано, то вважають, що воно дорівнює 0,
тобто пошук здійснюють з початку рядка.

Функція find_first_not_of(t,j) повертає індекс першої появи символу, відмінного від символів


рядка t, починаючи позиції j. Якщо значення j не вказано, то вважають, що воно дорівнює 0,
тобто пошук здійснюють з початку рядка.

Функція find_last_not_of(t,j) повертає індекс останньої появи символу, відмінного від


символів рядка t, починаючи позиції j. Якщо значення j не вказано, то вважають, що воно
дорівнює 0, тобто пошук здійснюють з початку рядка.
#include<iostream>
#include<string>
using namespace std;
int main()
{ string s = "01234567890123456789",
t = "abc654";
cout<<s.find_first_of(t)<<endl; // 4
cout<<s.find_first_of(t,11)<<endl; // 14
cout<<s.find_last_of(t)<<endl; // 16
cout<<s.find_last_of(t,11)<<endl; // 6
cout<<s.find_first_not_of(t)<<endl; // 0
cout<<s.find_first_not_of(t,11)<<endl; // 11
cout<<s.find_last_not_of(t)<<endl; // 19
cout<<s.find_last_not_of(t,11)<<endl; // 11
}
Функція compare надає можливість порівнювати рядок або його частину з іншим рядком-
параметром і має такі аргументи (перші два або вказують, або не вказують одночасно):
 індекс, з якого починають перегляд символів рядка для порівняння;
 кількість символів у підпослідовності, утвореній для порівнюяння;
 рядок, який порівнюють з рядком, до якого застосовано функцію.
Функція compare працює таким чином:
 порівнюють коди перших символів, якими різняться рядки;
 якщо початок одного рядка збігається з іншим, то коротший рядок вважають меншим;
 якщо функцію викликає менший рядок, то вона повертає від'ємне ціле значення;
 якщо функцію викликає більший рядок, то вона повертає додатне ціле значення;
 якщо функцію викликає такий самий рядок, то вона повертає ціле значення нуль
— див. наступний код, у якому в коментарях записано результат виведення:
#include <iostream>
#include <string>
using namespace std;
int main()
{ string s = "01234",
t = "43210",
u = "0123432100";
cout<<s.compare(t)<<endl; // -1
cout<<t.compare(s)<<endl; // 1
cout<<s.compare(s)<<endl; // 0
cout<<s.compare(u)<<endl; // -5
cout<<u.compare(s)<<endl; // 5

cout<<u.compare(0,5,s)<<endl; // 0
cout<<s.compare(0,5,u)<<endl; // -5
cout<<u.compare(4,4,t)<<endl; // -1
cout<<u.compare(4,5,t)<<endl; // 0
cout<<u.compare(4,6,t)<<endl; // 1
return 0;
}
Функція c_str повертає рядок типу char * і модифікатором const з тією самою
послідовністю символів — див. наступний код, у якому в коментарі записано результат
виведення:
#include <iostream>
#include <string>
using namespace std;
int main()
{ string s = "abcd";
const char * p;
p = s.c_str();
cout<<p; // abcd
return 0;
}
Функції length і size повертають довжину рядка — див. наступний код, у якому в коментарі
записано результат виведення:
#include <iostream>
#include <string>
using namespace std;
int main()
{ string s = "abcdefg";
cout<<s.length()<<endl; // 7
cout<<s.size()<<endl; // 7
}
Функція push_back(c) додає до рядка символ c типу char.
#include <iostream>
#include <string>
using namespace std;
int main()
{ string s = "Hello";
s.push_back('!');
cout<<s; // Hello!
return 0;
}
Функція resize(n) змінює довжину рядка на n. Якщо після n записати символ, то при
збільшенні довжини рядка вільні місця буде заповнено цим символом:
#include <iostream>
#include <string>
using namespace std;
int main()
{ string s = "Hello";
s.resize(8,'!');
cout<<s; // Hello!!!
}
Функція substr(j) повертає підрядок даного рядка, починаючи з символу з індексом j, до
кінця рядка. Якщо після j вказати необов'язковий параметр k, то буде повернуто підрядок
довжини k даного рядка, починаючи з символу з індексом j.
#include <iostream>
#include <string>
using namespace std;
int main()
{ string s = "0123456789";
cout<<s.substr(5)<<endl; // 56789
cout<<s.substr(2,5)<<endl; // 23456
}
На основі поданого вище опису можна створити програму, яка зчитує рядок і розбиває його
на рядки за символами-роздільниками, які не приєднують до рядків результату. Така
програма може мати застосування, наприклад, до опрацювання даних у форматі електронних
таблиць csv з роздільником ';' як усталено. Використання вільно поширюванної бібліотеки
boost дає можливість істотно спростити код такої програми. Але спочатку потрібно
встановити цю бібліотеку. При ОС Ubuntu i Linux Mint для цього достатньо виконати таку
вказівку Терміналу:

sudo apt-get install libboost-dev

You might also like