Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MV_Prog_1kurs_1chast2012.doc
Скачиваний:
12
Добавлен:
13.04.2015
Размер:
667.65 Кб
Скачать

3Робота з рядками

3.1 Мета роботи

Отримати практичні навички програмування на С++ задач, де використовується символьна інформація.

3.2 Методичні вказівки до організації самостійної роботи студентів

У мові С++ є кілька можливостей роботи з символьними даними. Класична робота зводиться до використання масива символів. Для того, щоб скористуватися стандартними функціями С++ для роботи з рядками, треба їх файли підключити в директиві #include <string.h>. Основні функції з цього пакету наведено нижче.

char*strcat (char*_dest, const char*_src); — функція реалізує сціплення рядка dest з рядком src. Функція вертає покажчик на початок отриманого рядка (dest). Проміжний символ‘\0’ рядка dest гаситься.

char*strncat (char*_dest, const char*_src, size_t_maxlen); функція приєднує maxlen символів з рядка, на який вказує src, до рядка, на який вказує dest. Рядок dest повинен містити не менше maxlen вільних байтів. Якщо maxlen більше рядка src, виконується проста конкатенація.

char*strchr (const char*_, int_c); функція вертає покажчик на позицію першого входження символу “c” в рядок, на який вказує s. В рядок s включається і символ ‘\0’.

int strcmp (const char*_s1, const char*_s2); — функція виконує порівняння двох рядків, на початок яких вказують s1 і s2. Функція вертає значення: менш нуля, якщо s1<s2; рівне нулю, якщо s1==s2; більше нуля, якщо s1>s2.

int strnсmp (const char*_s1, const char*_s2, size_t_maxlen); —функція, що аналогічна функції strcmp () і відрізняється тим, що виконується порівняння перших maxlen байтів.

int stricmp (const char *_s1, const char *_s2); —функція виконує порівняння двох рядків, на що вказуютьs1 іs2. Перед порівнянням символи перетворюються в малі. Функція вертає значення: більше нуля, якщоs1>s2; рівно нулю, якщоs1==s2; менш нуля, якщоs1<s2.

int strlen (const char*_s); — функція вертає довжину рядка в байтах, на який вказує s. Нуль-терминатор не враховується.

char*stpcpy (char *_dest, const char *_src);функція копіює рядок, на котрий вказуєsrc, в інше місце в пам'яті, на що вказуєest. Функція вертає покажчик на кінець рядка, що скопіювався вdest.

char*strncpy (char*_dest, const char*_src, size_t_maxlen); —функція копіює maxlen байт з рядка, на який вказує src, в інше місце в пам'яті, на що вказує dest. Нуль-термінатор теж копіюється. Якщо maxlen менш довжини рядка src, до рядка src не приєднується символ“\0”.І якщо більше, то рядок src переноситься повністю, а символи, що залишалися, заповнюються символом “\0”. Функція вертає покажчик dest.

char *strlwr (char *_s); функція перетворює всі символи рядка, на початок якого вказує s, в малі літери. Функція повертає покажчик на початок цього рядка.

char *strups (char *_s);функція перетворює всі символи рядка, на початок якої вказуєs, в великі літери. Функція вертає покажчик на отриманий рядок.

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

char *strtok (char *_s1, char *_s2); —функція вертає наступну лексему ізs1, яка відділена любим символом з набораs2.

Приклад 3.1

Підрахувати кількість слів у рядку, враховуючи те, що пробілів, а також інших розділових знаків між словами може бути скількі завгодно.

1-ий варіант вирішення поставленої задачі

#include <iostream>

#include <conio.h>

#include <string.h>

int main()

{

char s[]=" Repetitio est , mater studiorum !";

int i=0, col=0;

char spes[]=" ;!,.?\t";

int strLen = strlen(s);

while (i<strLen)

{

if ( !strchr(spes, s[i]) )

{

col++;

while (!strchr(spes, s[i]) && i<strLen)

i++;

}

else

{

while (strchr(spes, s[i]) && i<strLen)

i++;

}

}

std::cout<<"\nKilkist sliv="<<col<<'\n';

getch();//задержка экрана

return 0;

}

2-ий варіант вирішення поставленої задачі з використанням функції strtok

#include <iostream>

#include <conio.h>

#include <string.h>

int main()

{

int col=0;

char str[] = "Repetitio est mater studiorum. Help.";

char seps[] = " ;,\t\n";//знаки препинания

std::cout<<str<<std::endl;

char *token = strtok(str, seps);//поиск первого слова

while( token != NULL )

{

col++;

token = strtok(NULL, seps );//поиск следующего слова

}

std::cout<<"\nKilkist sliv="<<col<<std::endl;

getch();//задержка экрана

return 0;

}

Приклад 3.2

Знайти в тексті всі слова, що починаються та закінчуються буквою a, та скопіювати їх в нову рядок через пробіл. Під новий рядок необхідно виділити рівно стільки пам’яті, скільки необхідно для запису знайдений слів.

Розв’язок. Поставлено задачу вирішимо у два етапи: спочатку підрахуємо кількість необхідної пам’яті, а за тим запишемо у новий рядок необхідні слова.

#include <iostream>

#include <conio.h>

#include <string.h>

int main()

{

char str[] = "test word 1: asdda. Test word 2: asdfg, word 3: Awea";

char strCopy[sizeof(str)];

strcpy(strCopy,str);//створюємо копію рядка

char seps[] = " :?!;,.\t\n";//знаки препинания

std::cout<<str<<std::endl;

char *token = strtok(str, seps);//пошук першого слова

int lenResult=0;

int countWord=0; //кількість слів

//Підрахуємо кількість необхідної пам'яты для рядка-результата

while( token != NULL )

{

int last = strlen(token)-1;

if (

(token[0] == 'a' || token[0] == 'A')

&& (token[last] == 'a' || token[last] == 'A')

)

{

lenResult+= strlen(token)+1;

++countWord;

}

token = strtok(NULL, seps );//пошук наступного слова

}

char* resString = new char [lenResult];

resString[0]='\0'; //створюєму пустий рядок

strcpy(str,strCopy);//відновлюємо рядок

token = strtok(str, seps);//пошук першого слова

int curentNumberWord=0;

while( token != NULL )

{

int last = strlen(token)-1;

if (

(token[0] == 'a' || token[0] == 'A')

&& (token[last] == 'a' || token[last] == 'A')

)

{

strcat(resString,token);

++curentNumberWord;

if (countWord!=curentNumberWord)//Якщо не останнє слово

{

strcat(resString," ");

}

}

token = strtok(NULL, seps );//пошук наступного слова

}

std::cout<<"\nResult:\n"<<resString<<std::endl;

delete[]resString;

getch();//задержка экрана

return 0;

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]