Для опрацювання масивів символів у мові С++ є стандартні функції, які описані у модулі string.h. Розглянемо деякі з них.
strlen(<рядок>) – визначає фактичну кількість символів у рядку, застосовується у виразах;
strcat(r1, r2) – команда з’єднання рядків r1, r2 в один рядок, результат присвоює змінній r1;
strncat(r1, r2, n) – до змінної r1 додає перших п символів рядка r2, команда;
strcpy(r1, r2) – копіює символи з рядка r2 в рядок r1, команда;
strncpy(r1, r2, n) – копіює перших n символів рядка r2 в рядок r1, команда;
strchr(r1, <символ>) – визначає перше входження деякого символу у рядок r1 так: повертає рядок, який починається від першого входження заданого символу до кінця рядка r1, застосовується у виразах;
strrchr(r1, <символ>) – визначає останнє входження заданого символу у рядок, застосовується у виразах;
strspn(r1, r2) – визначає номер першого символу, який входить у рядок r1, але не входить у рядок r2, застосовується у виразах;
strstr(r1, r2) – визначає в рядку r1 підрядок, що починається з першого входження рядка r2 у рядок r1, застосовується у виразах;
strtok(r1, r2) – визначає частину рядка r1, яка закінчується перед першим однаковим символом рядків r1 та r2;
strnset(r1, <символ>, n) – вставляє n разів заданий символ перед рядком r1, застосовується у виразах;
strupr(r1) – перетворює усі малі літери рядка у великі;
strlwr(r1) – перетворює усі великі літери рядка у малі;
strrev(r1) – записує рядок у зворотному порядку.
Приклад 2. Розглянемо результати застосування функцій до таких змінних:
charLviv[] = “Львівська політехніка”,
Un[30] = “НУ”,
r1[30] = “”;
char*p; intn;
Застосування функцій
Результат
n = strlen(Lviv)
strcat(Un, Lviv)
strncat(Un, Lviv, 10)
strcpy(r1, Lviv)
strncpy(r1, Lviv, 10)
p = strchr(Lviv, ‘П’)
p = strrchr(Lviv, ‘i’)
n = strspn(Lviv, “Львів”)
p = strstr(Lviv, “тех”)
p = strtok(Lviv, “кс”)
p = strnset(Lviv, ‘x’, 10)
p = strupr(“I Love You”)
p = strlwr(“I Love You”)
p = strrev(“техніка”)
Зауваження 2. Функції перетворення літер strlwrіstrupr діють лише для латинського алфавіту. Крім того, у деяких версіях мови С++ ці функції можуть записуватись інакше: _strlwr, _strupr.
У бібліотеці stdlib.h є стандартні функції перетворення типів даних. Зокрема, функція atoi(r1) перетворює рядок символів r1 у дане цілого типу int, а функція іtoа(<числове дане>, r1, <система числення>) – дане цілого типу int у рядок r1. Для перетворення даних типу double у рядок символів визначена функція gcvt(<числове дане>, <кількість знаків у числі>, r1), а обернену дію виконує функція strtod.
Приклад 3. Розглянемо результати дії цих функцій для оголошених нижче змінних.
intn;
doublef;
char r1[5], *p;
Застосування функції
Результат
n = atoi(“12”)
itoa(12, r1, 10)
gcvt(-3.14, 4, r1)
f = strtod(“-3.1415”, &p)
Рядки символів можна порівнювати між собою. Два рядки порівнюють зліва направо посимвольно, причому ‘А’ < ’В’, ‘В’ < ‘С’ тощо. Більшим вважається символ, який розміщений в алфавіті далі (він має більший номер у таблиці кодів ASCII, див. далі). Для порівняння рядків у модулі string.h надані такі функції:
· strcmp(r1, r2) – порівнює рядки символів r1 і r2 з урахуванням регістра для латинського алфавіту;
· stricmp(r1, r2) – порівнює рядки r1 і r2, не розрізняючи великих і малих літер латинського алфавіту.
Результатом виконання цих функцій є від’ємне число (якщо рядок r1 менший від рядка r2), 0 (якщо рядки однакові) або додатне число (рядок r1 менший від рядка r2).
Приклад 4. Розглянемо результат дії функцій
Функція
Результат
n = strcmp(“Весна”, “весна”)
n = strcmp(“весна”, “Весна”)
n = strcmp(“Весна”, “Весна”)
n = strіcmp(“Весна”, “весна”)
n = strіcmp(“Vesna”, “vesna”)
Задача 1 (про довжину фрази).Увести рядок символів та визначити його довжину.
Зробимо це двома способами:
1) за допомогою вказівника типу char і виділення динамічної пам’яті:
#include<iostream.h> // Довжина рядка символів
voidmain()
{
char*s; // Оголошуємо вказівник на рядок
s = new char[50]; // Виділяємо пам’ять для введення рядка
cin>> s;
intd = 0;
while(*s++) d++;
cout<< d;
}
2) визначивши різницю адрес першого й останнього символів:
#include<iostream.h> // Довжина рядка символів
voidmain()
{
char*s, *p; // Оголошуємо вказівник на рядок
s = new char[50]; // Виділяємо пам’ять для введення рядка
cin>> s;
p = s; // Вказівник р вказує на перший символ рядка// Вказівник s тепер вказуватиме
while(*s++); // на останній символ рядка
intd;
// Визначаємо довжину рядка як різницю адрес
d = s – p + 1;
cout<< d;
}
Задача 2 (про пошук слова у фразі). Нехай задано рядок "Скоро будуть канікули". Визначити довжину рядка. Вивести на екран друге слово цього рядка.
#include<iostream.h> // Пошук другого слова за допомогою функцій
#include<string.h>
voidmain()
{
charr1[] = “Скоро будуть канікули”;
char*p;
cout<< r1 << “\n”;
cout<< “Довжина рядка r1 = ” << strlen(r1) << “\n”;
// Встановлюємо вказівник р на перший пропуск
p = strchr(r1, ‘ ‘); // у рядку r1// З рядка р вилучаємо всі символи після його
strtok(p, “ “); // першого пропуску
cout<< p;
}
Подамо ще один спосіб розв’язання задачі 2, в якому рядок розглядається як масив символів і функції для роботи з рядками не використовуються.
#include<iostream.h> // Рядок як масив символів
#include<conio.h>
#include<string.h>
voidmain()
{
clrscr();
charr1[] = “Скоро будуть канікули”;
char*p;
intn1, n2, k, m;
m = 0;
k = strlen(r1);
cout<< “Довжина рядка r1 = ” << k << “\n”;
for(inti = 0; i < k; i++) // Переглядаємо всі символи рядка
if(r1[i] == ‘’) // Шукаємо пропуск
{
m++; // Визначаємо номери першого
if(m == 1) n1 = i; // та другого
if(m == 2) n2 = i; // пропусків
}
// Виводимо слово між двома пропусками
for(i = n1 + 1; i < n2 – 1; i++) cout<< r1[i];
getch();
}