Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Функції операцій над символьними рядками

Поиск

Прототипи бібліотечних функцій, призначених для роботи з символьними рядками, оголошені в заголовному файлі <string.h>. Основну групу складають функції, які починаються префіксом str: str...(). У табл. 2.2 описано функції, які найчастіше використовуються у процесах опрацювання символьних рядків. Щоб скоротити записи прототипів функцій у табл. 2.2, в списку параметрів кожної функції вказано тільки імена параметрів. Типи параметрів в оголошеннях цих функцій є такими:

const char *s, *sl, *s2;

char *sr;

unsigned n;

int sym;

 

 

Символьні рядки, які опрацьовуються функціями <string.h>, мають обов'язково закінчуватись' \0'. У разі звертання до функцій конкатенації (об'єднання) та копіювання рядків треба забезпечити, щоб розмірність масиву символів sr була достатньою для запису рядка результату, оскільки функції не контролюють дов­жин рядків. Крім цього, рядки sr і s у функціях конкатенації та копіювання не повинні перекриватись.

/*****************************************************/

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

/*****************************************************/

#include <conio.h>

#include <iostream>

#include <string.h>

 

using namespace std;

 

int main (void)

{

char str[]= "abcdef # 12345679 # uvwxyz"; /* рядок */

char *p1, *p2; /* вказівники на початок і кінець підрядка */

 

cout << "Vkhidnyj rjadok: ";

cout << str << endl << endl;;

p1 = strchr(str, '#'); /* перший символ '#' */

p2 = strrchr(str, '#'); /* останній символ '#' */

strcpy (p1, p2+1); /* перенесення кінцевої частини рядка */

 

cout << "Rjadok pislja vyluchennja: ";

cout << str << endl;

 

getch();

 

return 0;

}

 

Щоб вилучити підрядок, знаходимо його початок (перший символ '#' у str) і кінець (останній символ '#'). Потім переносимо, використовуючи функцію strcpy(), кінцеву частину основного рядка на місце підрядка, який треба видалити.

 

Табл. 2.2

Основні функції опрацювання символьних рядків

Функція Призначення
char* strcpy(sr, s); Копіює рядок s (з '\0' включно) за адресою, заданою параметром sr. Повертає значення sr - адресу скопі-йованого рядка.
char* strcat(sr, s); Додає рядок s (з '\0' включно) у кінець рядка sr. Повертає значення sr – адресу доповненого рядка.
int strcmp(s1, s2); Послідовно порівнює символи рядків s1 і s2 як дані з типом unsigned char. Повертає ціле число, значення якого <0, якщо s1<s2; 0, якщо s1 == s2; > 0, якщо s1 > s2.
char* strncpy (sr, s, n); Аналог strcpy(), але з s копіюється не більше, ніж n початкових символів; якщо скопійована група символів не закінчується '\0', то нуль-символ у sr не заноситься.
char* strncat (sr, s, n); Аналог strcat(), але додає до sr тільки n початкових символів з s; у кінець об'єднаного рядка заноситься '\0'.
char* strncmp(s1, s2, n); Аналог strcmp(), але порівнює тільки n початкових сим­волів рядків s1 та s2. Якщо якийсь із рядків коротший за n, то порівняння припиняється з досягненням ' \0'.
unsigned strlen(s); Повертає довжину рядка s у символах (' \ 0' не врахову­ється).
char* strchr(s, sym); Перевіряє, чи символ sym входить у рядок s. Повертає вказівник на перше входження sym у s або NULL, якщо sym не зустрічається в рядку s.
char* strrchr(s, sym); Аналог strchr(). Повертає вказівник на останнє вход­ження символа sym у рядок s або NULL, якщо syVm не зустрічається в рядку s.
char* strstr(s1, s2); Перевіряє, чи рядок s2 входить як підрядок у s1. Повертає вказівник на перший символ рядка s2 у s1 або NULL, якщо рядок s2 не зустрічається у рядку s1.
char* strtok(sr, s); Виділяє в рядку sr лексеми, обмежені символами з рядка s. Повертає вказівник на виділену лексему або NULL.
char* strdup(s); Копіює рядок s (з ' \0 ' включно) в динамічну пам'ять, попередньо виділивши там ділянку потрібної довжини. По­вертає адресу рядка в динамічній пам'яті.

 

Останньою в табл. 2.2 записана функція strdup(), яка заносить копію заданого символьного рядка (з нуль-символом включно) у динамічну пам’ять та повертає адресу, за якою записано рядок. Функція strdup() не належить до функцій, що підтримуютьс стандартом мови С/С++, хоча вона входить до складу більшості С-бібліотек.

 

 

Функція виділення лексем. Зупинимось детальніше на функції strtok(), оголошення якої наступне:

char* strtok(char* str, const char* lim);

Ця функція виконує поділ символьного рядка str на окремі лексеми, записуючи після кожної лексеми '\0'. Рядок lim задає набір символів, якими можуть бути обмежені лексеми рядка str (нуль-символ у переліку обмежувачів вказувати не треба). Для ви­ділення всіх лексем символьного рядка функцію використовують циклічно. У першо­му звертанні до strtok() вказують адресу початку рядка, а функція повертає адресу першої знайденої лексеми. У наступних звертаннях до strtok() замість першого параметра записують порожній вказівник NULL, а функція повертає адресу наступної лексеми рядка. Коли всі лексеми виділені, функція повертає NULL.

 

/***********************************************/

/* Виділення слів-лексем із символьного рядка */

/***********************************************/

#include <iostream>

#include <cstring>

#include <conio.h>

 

using namespace std;

 

int main(void)

{

char example[]="Символи, рядки (виділення слів-лексем)";

const char *limits = ",.;()-"; /* символи-обмежувачі лексем */

char *pw; /* вказівник на лексеми */

 

setlocale(0,".1251"); /* Встановлення локалізації для виводу кириличних символів */

 

cout << "Вхідний текст: " << example << endl;

cout << "\n Слова: \n";

pw = strtok (example, limits); /* знаходження першої лексеми */

while(pw!=NULL)

{

cout << pw << endl;

pw = strtok (NULL, limits); /* пошук наступної лексеми */

}

_getch();

return 0;

}

 


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

Перетворення "символьний рядок => число". У багатьох задачах необхідно Перетворювати числові дані, записані у формі текстових рядків, в одну з внутрішніх форм збереження чисел. Такі перетворення реалізують стандартні бібліотечні функції, оголошені в <stdlib. h> (табл.2.3). Типи параметрів цих функцій наступні:

 

const char *st;

char **end;

int base;

 

Табл. 2.3

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

Функція Призначення
int atoi (st); Виділяє у рядку st перше ціле десяткове число і перетворює його у дане з типом int. Числу може передувати довільна кількість символів пробілу. Кінцем рядка вважається пер­ший символ, що не належить до цифр. Повертає знайдене числове значення у разі успішного перетворення, а в разі помилки - результат не визначений.
long atol (st); Аналог atoi(), але перетворює рядок у число з типом long.
double atof (st); Аналог atoi(), але перетворює рядок st у дане з типом double. Число у рядку може бути записане як ціле чи як дійсне у формі з фіксованою або з плаваючою крапкою.
long strtol (st, end, base); Розширений варіант atol(). Вказівник end (цей параметр є вказівником на вказівник) задає адресу змінної-вказівника, в яку буде записано адресу першого символа, що зали­шився неперетвореним. Параметр base визначає основу системи числення, в якій записано число і може приймати значення від 2 до 36: цифрами числа можуть бути арабські цифри і послідовні малі або великі латинські літери (для base >10). Якщо base дорівнює 0, то основа числа визна­чається формою його запису: число, що починається 0, вва­жається вісімковим, число з префіксом 0X чи 0x – шістнадцятковим, всі інші числа розглядаються як десяткові.
unsigned long strtoul(st, end, base); Аналог strtol(), але повертає значення, що має тип unsigned long.
fcouble strtod (st, end); Розширений варіант atof(). Перетворює початкову части­ну st у дане з типом double. Додатково повертає через end адресу першого символа, записаного за числом.
double strtof (st, end);* Аналог strtod(), але повертає значення з типом float.
double strtold (st, end);* Аналог strtod(), але повертає значення, що має тип long double.

 

 

Перетворення "число => рядок". Бібліотека мови програмування С++ додатково містить ряд функцій зворотних перетворень "число => символьний рядок серед яких:

 

char* itoa(int num, const char* str, int base);

char* ltoa(long num, const char* str, int base);

char* ultoa(unsigned long num, const char* str, int base);

 

Ці функції відрізняються між собою тільки типом параметра num – цілого числа, яке потрібно перетворити. Всі три функції формують із числа num рядок символів, що відповідає запису цього числа в системі числення з основою base, і повертають вказівник на перший символ створеного рядка. Сформований рядок записується за адресою str. Функції itoa() та ltoa() записують від'ємні числа зі знаком мінус

 

 



Поделиться:


Последнее изменение этой страницы: 2016-04-26; просмотров: 547; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.222.179.96 (0.011 с.)