ВІКІСТОРІНКА
Навигация:
Інформатика
Історія
Автоматизація
Адміністрування
Антропологія
Архітектура
Біологія
Будівництво
Бухгалтерія
Військова наука
Виробництво
Географія
Геологія
Господарство
Демографія
Екологія
Економіка
Електроніка
Енергетика
Журналістика
Кінематографія
Комп'ютеризація
Креслення
Кулінарія
Культура
Культура
Лінгвістика
Література
Лексикологія
Логіка
Маркетинг
Математика
Медицина
Менеджмент
Металургія
Метрологія
Мистецтво
Музика
Наукознавство
Освіта
Охорона Праці
Підприємництво
Педагогіка
Поліграфія
Право
Приладобудування
Програмування
Психологія
Радіозв'язок
Релігія
Риторика
Соціологія
Спорт
Стандартизація
Статистика
Технології
Торгівля
Транспорт
Фізіологія
Фізика
Філософія
Фінанси
Фармакологія


Основні функції обробки символьних типів

 

У ранніх версіях С++ рядки розглядалися як символьні масиви і робота з ними ґрунтувалася на використанні цих масивів. Розроблена бібліотека функцій <string.h> містить могутні засоби для роботи зі строковими масивами. Згодом була розроблена стандартна бібліотека шаблонів Standard Template Library (STL) , що надає ще більш могутні засоби роботи з рядками, об'єднані в клас <string>. Цей клас включається як заголовний файл , тобто:

#include <string>// без літери h

 

Для обробки символьних типів даних бібліотека функцій <string.h> має велику кількість вбудованих функцій, що збільшують продуктивність праці програмістів і скорочують час на розробку програм. Ця бібліотека містить такі функції, як наприклад:

 

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

­ функції перетворення символів;

функції перевірки рядків;

функції маніпулювання рядками.

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

Розглянемо прототипи, короткий опис дій і методику використання функцій, які частіше використовуються:

 

¾ Копіювання рядків

char strcpy (s, *st); ¾ копіює байти рядка st у рядок s, (включаючи "\0"; повертає s),наприклад:

 

char str [50];

strcpy (str, "Сьогодні гарна погода ");

char *strdup (const char *str); ¾ копіює рядок strі повертає

покажчикна рядок – копію, наприклад:

 

char *st1 = " Прийшла весна";

char *st2;

st2= strdup (st1); // Копіюється st1 у st2

char * strnсpy (char *st1,const char *st2, int n); ¾ копіює n символів з рядка st2у st1,рядок st1 повинний бути більше чи дорівнювати st2, інакше виникне помилка, наприклад:

 

char st1[]= "Паскаль ";

char st2[] = "Привіт з далека ";

strnсpy (st1,st2,3);// Тепер у st1¾ "Прикаль"

 

¾ Конкатенація слів

char *strcat (char *st1, const char *st2); ¾ поєднує st1і st2і повертає st1,наприклад:

char string [100];

strcpy (string, "Borland ");

strcat (string, " C++5"); ,

получаємо рядок string = "Borland C++ 5" ;

 

char *strncat (char *st1, const char * st2, int n);¾ додає до рядка st1 n символів рядка st2і повертає в st1, наприклад :

сhаr st1 [90] = "Привіт " ;

char st2 [50] = " Сашко і Маша";

strncat (st1, st2, 5);

st1 ="Привіт Сашко ".

¾ Порівняння рядків

int strcmp ( char *st1, char *st2); - порівнює рядки st1 і st2і повертає цілу величину, рівну:

< 0 ¾ якщо st1 < st2;

= 0 ¾ якщо st1 = st2;

> 0 ¾ якщо st1 > st2; ,

наприклад:

char st1[] = "Слово " ;

char st2 [] = "слово";

int k;

k = strcmp (st1, st2); // k < 0;

int stricmp (const char *st1, const char *st2); ¾ виконує порівняння рядків не зважаючи на регістр символів; повертає цілу величину як і в попередньому випадку (див. функцію strcmp()), наприклад:

char st1[] = "Слово " ;

char st2 [] = "слово";

int k;

k = stricmp (st1, st2); k=0;

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

< 0¾ якщо st1 < st2;

= 0 ¾ якщо st1 = st2;

> 0 ¾ якщо st1 > st2;

 

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, наприклад:

 

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.h>

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);

{

for ( int i = k; i < strlen(st); i++)

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

st [i] ='\0';// Запис '\0'у кінець нового рядка

}

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

n ¾кількість символів у підрядку що видаляється ;

k ¾ позиція, з якої треба видалити підрядок.

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

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

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

#include <iostream.h>

#include <string.h>

const int n = 50;

const int m = 5;

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

Void main()

{

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)

{

for( int i = k ; i < strlen ( st ); 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, якщо зустрінеться символ, що не може бути перетворений. Рядок повинний містити коректне число, наприклад "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>:

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 <iostream.h>

#include <string.h>

Void main( )

{

char mst[ 5] [15];

char *ps[5], *ptr;

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 <iostream.h>

#include <string.h>

Void main()

{

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

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 <iostream.h>

#include <string.h>

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;*/

}

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

}

 

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

 

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

#include <iostream.h>

#include <string.h>

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 <iostream.h>

#include <string.h>

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. Як порівняnи дані строкового типу?

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

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

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

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

 

© 2013 wikipage.com.ua - Дякуємо за посилання на wikipage.com.ua | Контакти