Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Информатика.ЛБ

.pdf
Скачиваний:
15
Добавлен:
14.04.2015
Размер:
950.97 Кб
Скачать

char *strnicmp (char *st1, char *st2, int n); виконує порівняння рядків c заданою кількістю символів n у st1 і st2, не зважаючи на регістр і повертає цілу величину як і в попередньому випадку.

Перетворення символів рядка

char *strlwr (char *st); перетворить символи рядка st верхнього регістра в символи нижнього регістра, інші символи не зачіпаються, Наприклад:

char st [i] =" Привіт Маша';

strlwr (st); // тепер st = "привіт маша".

char *strupr (char *st); перетворить символи рядка st нижнього регістра в символи верхнього регістра, інші символи не зачіпаються;

char *strrev (char *st); записує символи в рядку st у зворотному порядку (реверсує рядок), наприклад:

char st [] =" Hello";

strrev (st); // тепер st = "olleН ".

char *strchr (char *st , int c); визначає перше входження символу c у рядок st; повертає покажчик на символ у рядку st, що відповідає введеному зразку, наприклад:

сhаr st [90] = " Borland C++ 5 " char *spt;

spt = strchr (st , '+');

// Тепер покажчик spt указує на підрядок "++5" рядка st.

char

*strrchr (char *st, int c); знаходить останнє входження символу

c у рядок

st; якщо символ c у рядку не виявлений повертає 0, інакше

повертає покажчик на останній символ у рядку st, що відповідає заданому зразку, наприклад:

char st [80] = "Borland C++5"; char *spt;

spt = strrchr (st , '+');

//Тепер покажчик spt указує на підрядок "+5" рядка st.

Пошук підрядка в рядку

strspn (const char *st1, const char *st2 ); повертає кількість символів від початку рядка st1, що збігаються із символами рядка st2, де б вони не знаходилися в st2, наприклад:

51

char st1 [] = "Borland C++5"; char st2 [] = " narlBod ";

int k;

k = strspn (st1, st2); // k=8

У цьому випадку змінна k одержує значення рівне 8, тому що перші 8 символів рядка містилися в st1 (включаючи символ проміжок).

char *strstr (const char *st1,const char *st2); функція шукає в рядку st1 перше входження st2 і повертає покажчик на перший символ, знайдений у st1 з підрядка st2; якщо рядок st2 не виявлена в st1 - функція повертає 0, наприклад:

char st1 [] = "Привіт друг, йдемо в кіно " ; char st2 [] = "друг ';

char*spt;

spt = strstr (st1, st2);

Результат виконання:

spt = " друг, йдемо в кіно".

У разі потреби визначення останнього входження, треба спочатку реверсувати рядок за допомогою функції strrev.

char *strtok ( char *st, const char *dlm); - розбивка рядка на лексеми (

сегменти ), обмежені символами включеними до складу параметра dlm. Цей параметр може містити будь-яку кількість різних обмежників ознак границь лексем; після виділення лексеми в рядок st міститься символ '\0'.

Наступні виклики функції strtok() повинні бути. с першим аргументом NULL. Вони будуть повертати покажчик на інші , наявні в st лексеми. Щораз після завершення виділення лексем у її кінці замість розділового символу міститься символ '\0'. Після того, як у рядку не залишиться ні однієї лексеми, функція повертає NULL . Для збереження вихідного рядка її треба записати в резервну змінну. Цю функцію зручно використовувати для розбивки речення на слова або будь-які інші сегменти. Розглянемо приклад програми з використанням strtok():

Приклад 3.4 Увести речення, розбити його на слова з виведенням порядкового номера слова і підрахунком символів у кожнім слові:

//P3_4.CPP застосування функції strtok( ).

//визначення порядкового номера слова в реченні і

//підрахунок символів у кожнім слові

#include <string.h> #include < iostream>

52

using namespace std; void main (void)

{

char *tk, *spt =", .!";

char st[] = "Сашко, нехай завжди буде солнце!"; cout << st << endl;

int i = 1;

tk = strtok (st, spt); while (tk!= NULL)

{

cout << i << " слово-" << tk << " містить " << strlen(tk) << "символів" << endl;

tk = strtok (NULL,spt); i++;

}

}

Для видалення з рядка підрядка або символу з заданої позиції в мові С++ немає спеціальної функції, однак можна написати свою, наприклад:

void del (char *st, int k, int n);

{ int i;

 

for ( i = k;

i < strlen(st)-n; i++)

st[i] = st [i +n ];

st [i] ='\0';

// Запис '\0' у кінець нового рядка

}

де st вихідний рядок (покажчик на неї);

n кількість символів у підрядку що видаляється ; k позиція, з якої треба видалити підрядок.

Нижче наведений приклад, що ілюструє реалізацію цієї програми

Приклад 3.5 Скласти програму видалення підрядка в n символів з k - ой позиції в рядку.

//P3_5.CPP видалення підрядка

#include < iostream> using namespace std; #include <string.h> const int n = 50; const int m = 5;

void del(char *st, int, int); void main()

{

53

char st [n], st1 [m];

cout << "Введіть рядок"<< endl; cin. getline(st,n);

cout << "Введіть підрядок"<< endl; cin >> st1;

if(strstr (st,st1)!=NULL)

{

del(st, strstr (st,st1) - st, strlen ( st1) ); cout << st << endl;

}

}

void del(char *st,int k,int n)

{

int i;

for( i = k ; i < strlen ( st )-n; i++) st[i] = st[i+n];

st[i] = '\0';

}

void* memchr (const void *st, int s ,int n); функція шукає символ "s" у

рядку *st довжиною n байт, тобто в блоці пам'яті, на який указує покажчик st. Якщо символ s знайдений, функція повертає покажчик на цей символ, у противному випадку повертає NULL.

void* memcmp (const void *st, const void * s , n); і

void* memicmp (const void *st, const void * s ,int count); функції порівнюють n байт із двох буферів на її початок яких указують s1 і s2.

Функція повертає значення

 

 

 

 

< 0

якщо

s1

<

s2;

=0

якщо

s1 =

s2;

>0

якщо

s1

>

s2;

char *strset (char *st, int ch); функція заповнює рядок st символом ch і повертає покажчик на отриманий рядок.

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

Ці функції знаходяться у файлі <stdlib.h>

int atoi (const char *s); перетворить рядок s у число типу int. Повертається отримане число.Число 0, якщо зустрінеться символ, що не може

54

бути перетворений. Рядок повинний містити коректне число, наприклад "2345", і мати наступну структуру:

[ проміжки ] [знак числа] [ цифри].

long atol (const char *s); перетворить рядок s у число типу long int

(аналогічна функції atoi.)

double atof (const char *s); перетворить рядок символів у дійсне число double. Якщо при перетворенні зустрічається символ, що не може бути перетворена функція повертає 0.

Оброблюваний рядок повинний мати структуру:

[проміжки] [знак числа] [цифра. цифра] [літера е,Е,d або D] [знак порядку] [цифри порядку], наприклад ‖-12345.123 ‖ або ‖-12. 345123 Е3 ‖

char *ecvt (double vl, int n, int *dec, int *sign ); перетворить число vl у

рядок символів, кількість яких дорівнює n символів цифр. Положення десяткової крапки від першої цифри числа повертається в змінній, на яку вказує dec. Знак числа повертається в змінну на який указує sign. Якщо sign = 0 число додатнє, інакше від‘ємне. Отриманий рядок зберігається у внутрішній пам'яті функції, покажчик повертається на початок сформованого рядка.

сhar *fcvt (double vl, int n, int *dec, int *sign ); аналогічна попередній функції, але для ecvt - параметр dec задають загальна кількість цифр, то для fcvt - кількість цифр після десяткової крапки.

сhar *gcvt (double vl, int n, сhar *buf); перетворить число vl у рядок,

що поміщає в буфер, покажчик на початок якого є buf, n число цифр у символічному записі перетвореного числа. Отриманий рядок містить символ знака числа і десяткової крапки, якщо число містить менше десяткових цифр, ніж n. У цьому випадку молодша цифра дробової частини відкидається. Якщо перетворене число не міститься в задану кількість цифр n, функція генерує символьний запис в експонентній формі, включаючи в рядок символ Е и знак порядку. Функція повертає покажчик на початок сформованого рядка.

strlen (st) - повертає довжину st без нуль - термінатора '\0'.

Функції перевірки символів

Ці функції знаходяться у файлі <ctype.h>:

55

isgraph (s) повертає значення ‖істина‖ тобто не нуль, якщо s є друкованим символом і ―неістина ‖ (тобто 0) , якщо s є проміжком або яким - небудь не відображуваним символом.

isprint (s) повертає значення ‖істина‖ тобто не нуль , якщо s є друкованим символом, включаючи проміжок і ‖неістина‖ (тобто 0) у всіх інших випадках.

ispunct (s) повертає значення "істина" тобто не нуль , якщо s є знаком пунктуації(будь-який друкований символ крім проміжку і ―неістина‖ (тобто 0) в інших випадках.

isdigit (s) повертає значення "істина" тобто не нуль , якщо s є цифрою від 0 до 9 і ―неістина‖ (тобто 0) в інших випадках.

isalnum (s) повертає значення "істина", тобто не нуль, якщо s є цифрою або літерою (заголовною або строковою ) і ―неістина‖ (тобто 0) у всіх інших випадках (тобто перевіряє алфавітні і цифрові символи).,

tolower (s) перетворить символ s до нижнього регістра;

toupper (s) перетворить символ s до верхнього регістра;

atoi (s) перетворить рядок s до ціле число;

atol (s) перетворить рядок s до довгого цілого;

atof (s) перетворить рядок s до числа з крапкою.

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

Приклад 3.5 Ввести список прізвищ (рядків) і відсортувати його за алфавитом.

//P3_5.CPP сортування списку прізвищ за алфавитом

#include <string.h> #include < iostream> using namespace std;

void main( )

{

char mst[ 5] [15]; char *ps[5], *ptr;

56

int і, n, k;

cout << "Введіть прізвища \n"; for( i = 0; i < 5; i++)

{

gets (mst [i] ); ps[i] = mst[i];

}

cout << "\n\t Вихідний список\n\n"; for( i = 0; i < 5; i++)

puts ( ps[ i ] );

// Сортування масиву

 

n = 5;

 

for (i = 1; i < n; i++)

// кількість переглядів

for ( k = 0; k < ( n – i );

k++)

if ( strcmp ( ps[k], ps[k+1] ) > 0)

{

ptr = ps[k]; ps[k] = ps[k+1]; ps[k+1] = ptr;

}

cout << "\n\n\t Відсортований список \n\n";

for ( i = 0; i < 5; i++) puts ( ps[ i ] );

}

Приклад 3.6 Ввести рядок і видалити в ньому зайві проміжки.

//P3_6.CPP ( видалення зайвих проміжків

#include <string.h> #include < iostream> using namespace std;

void main()

{

char st[] = "Прийшла весна в мої краї.";

57

int i,j;

for (i = 0; i < strlen(st)-1; i++)

{

if ((st[i] == ' ') &&(st[i+1] == ' '))

{

for (j = i+1; j < strlen(st); j++) st[j-1]=st[j];

i-- ;

}

cout << st; return 0;

}

Приклад 3.7 Визначити позицію входження підрядка в рядок.

//P3_7.CPP пошук позицій входження підрядка в рядок.

#include <string.h> #include < iostream> using namespace std;

const int m = 50; void main()

{

char *pt, mainstr[m], substr[m]; int n, k = 0;

cout << "Введіть рядок " << endl; cin.getline ( mainstr, m);

cout << "Введіть підрядок" << endl; cin.getline ( substr, m);

cout << "Головний рядок: " << mainstr << endl; cout << "Підрядок: " << substr << endl;

pt = strstr ( mainstr, substr );

cout << "Номер входу підрядка в рядок" << endl; while (pt)

{

k++;

n = pt - mainstr;

cout << k << " n = " << n << endl; pt = strstr( ++pt, substr );

cout << k << " ." << *pt << endl;

}

58

if ( k == 0) cout <<"Підрядок не міститься в рядку" << endl;

}

Приклад 3.8 Знайти заданий символ у рядку.

//P3_8.CPP пошук символів у рядку

#include <string.h> #include < iostream> using namespace std;

main( )

{

const int m = 25; char sim, *pt, str[m]; int n, k = 0;

cout << "Введіть рядок" << endl; cin.get ( str, m );

cout << "Введіть символ" << endl; cin >> sim;

pt = strchr ( str, sim );

cout << "Позиції входу символу в рядок" << endl; while (pt)

{

k++;

n = pt - str;

cout << k << " n = " << n << endl; pt = strchr(++pt, sim);

}

cout << "К-кість входжень="<<k<<endl;

if(k==0) cout << "Символ не входить у рядок" << endl; return 0;

}

Приклад 3.9 Ввести список прізвищ і вивести прізвища які починаються з літер "П" і " і закінчуються на "ко"

//P3_9.CPP вивести зі списку прізвища, що починаються з

//

літер "П" і "Ф" і закінчуються на "ко"

#include

<string.h>

59

#include < iostream> using namespace std;

void main(void)

{

const int n = 5;

char gr [ 5 ] [15], s2[2] = {"оk"}; int і;

cout << "Введіть прізвища" << endl; for(i = 0; i < n; i++)

cin >> gr[i];

cout << "Список прізвищ" << endl; for ( i = 0; i < n; i++)

cout << gr[i] << endl; strrev ( s2 );

cout << "Прізвища на П и Ф" << endl; for ( і = 0; і < n; і++)

if ( ( ( gr [і] [0] == 'П') || ( gr [і] [0] == 'Ф') )

&& ( strncmp ( strrev ( gr[i] ), s2 ,2) == 0)) cout << strrev( gr[i] ) << endl ;

}

3.2Контрольні питання і завдання

1.Що являє собою значення символьного типу?

2.Як задається тип символьних даних?

3.Що являє собою масив символьного типу?

4.Як уводяться строкові значення?

5.Як порівняти дані строкового типу?

6.Яке строкове дане більше ―стіл‖ або ―стілець‖?

7.Наведіть приклад використання операції конкатенації?

8.Як визначити кількість символів вхідних у строкове дане?

9.Які функції мови С++ використовуються для виділення підрядку з рядка?

3.4Варіанти індивідуальних завдань

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

60