Professional Documents
Culture Documents
Використання функцій по роботі з рядками
Використання функцій по роботі з рядками
Такі рядки називають С рядками або рядками в стилі С. Вони мають тип 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);
cout<<strpbrk(s,t);
бібліотека stdio.h
getchar() — повертає символ, зчитаний зі стандартного потоку введення;
putchar(с) — виводить символ с у стандартний потік виведення.
Примітка. Оператор cout зчитує рядок до перших пробілу або ознаки кінця рядка. Для
зчитування рядків, що містять пробіли використовують додаткові засоби мови С++.
Наприклад, наступну функцію.
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, опис якої подано далі:
де 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.
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,
тобто пошук здійснюють з початку рядка.
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 для цього достатньо виконати таку
вказівку Терміналу: