Добавил:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1-1 Программирование С++ / метод_лб_ пз_Інформатика.doc
Скачиваний:
5
Добавлен:
31.01.2021
Размер:
699.9 Кб
Скачать

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

У ранніх версіях С++ рядки розглядалися як символьні масиви і робота з ними ґрунтувалася на використанні цих масивів. Розроблена бібліотека функцій <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>

using namespace std;