Ћекции.ќрг


ѕоиск:




 атегории:

јстрономи€
Ѕиологи€
√еографи€
ƒругие €зыки
»нтернет
»нформатика
»стори€
 ультура
Ћитература
Ћогика
ћатематика
ћедицина
ћеханика
ќхрана труда
ѕедагогика
ѕолитика
ѕраво
ѕсихологи€
–елиги€
–иторика
—оциологи€
—порт
—троительство
“ехнологи€
“ранспорт
‘изика
‘илософи€
‘инансы
’ими€
Ёкологи€
Ёкономика
Ёлектроника

 

 

 

 


Device. put (char_var);, 4 страница




” мов≥ —≥ ≥ ранн≥х верс≥€х мови — ++ р€дки розгл€далис€ €к символьн≥ масиви ≥ вс€ робота з ними ірунтувалас€ на використанн≥ цих масив≥в. –озроблена б≥бл≥отека функц≥й < string.h > м≥стить могутн≥ засоби дл€ роботи з≥ строковими масивами.

ƒл€ опису р€дка використовуютьс€ звичайн≥ засоби опису масив≥в, наприклад: char str [25];. ≤ндексуванн€ такого масиву, €к ≥ будь-€кого ≥ншого, починаЇтьс€ з нул€. —имвольн≥ посл≥довност≥, розд≥лен≥ т≥льки пром≥жками, розгл€даютьс€ €к один р€док, тобто запис:

" ” той р≥к ос≥нн€

погода"

≥дентична р€дку " ” той р≥к ос≥нн€ погода ".

”с≥ р€дки, у тому числ≥ й ≥дентичн≥, у програм≥ розгл€даютьс€ €к р≥зн≥ об'Їкти. јдреса першого символу р€дка може використовуватис€ по-р≥зному:

¾ €кщо р€док застосовуЇтьс€ при ≥н≥ц≥ал≥зац≥њ масиву типу char, адреса його першого елемента стаЇ синон≥мом ≥мен≥ масиву. Ќаприклад, ≥дентичними Ї наступн≥ описи масиву:

char st [] = "—лово";

char st [6] = "—лово";

char st [6] = {'—' 'л' 'о' 'в' 'о' '\0'};

¾ €кщо р€док використовуЇтьс€ дл€ ≥н≥ц≥ал≥зац≥њ покажчика типу char*, адреса першого символу р€дка буде початковим значенн€м покажчика, наприклад:

char *pst = "—лово";,

тут описуЇтьс€ зм≥нна - покажчик pst, що одержуЇ початкове значенн€, р≥вне адрес≥ першого елемента (символ —);

¾ €кщо р€док використовуЇтьс€ у вираз≥ (там, де дозвол€Їтьс€ застосовувати покажчик), то комп≥л€тор п≥дставл€Ї у вираз р€дка адресу його першого символу, наприклад:

char *pst;

pst = " ѕерший символ";,

тут pst ¾ одержуЇ адресу букви " ѕ ", тобто при виконанн≥ операц≥њ присвоюванн€ в ком≥рку пам'€т≥, в≥дведену дл€ покажчика pst, записуЇтьс€ не масив символ≥в, а т≥льки покажчик на його початок, тобто адреса першого символу р€дка.

ѕри опис≥ символьного масиву, його ≥м'€ ¾ не зм≥нна, а покажчик-константа на початок р€дка. ќск≥льки дл€ константи не прид≥л€Їтьс€ адреса в пам'€т≥, то њњ не можна використовувати в де€ких операц≥€х адресноњ арифметики, наприклад, не можна зд≥йснювати операц≥ю присвоюванн€ вигл€ду:

char st [20];

st = " ѕетров"; // запис нев≥рний, тому що не можна зм≥нити значенн€ st

 

¬икористанн€ елемент≥в масиву зд≥йснюЇтьс€ через ≥ндекси або через покажчики. ƒл€ доступу до будь-€кого символу р€дка використовуЇтьс€ ≥ндекс масиву char, наприклад, €кщо описана зм≥нна char str[3], то трет≥м елементом масиву можна скористатис€, записавши: str[3] або *(str+3).

ѕри робот≥ з елементами масив≥в р€дк≥в, тобто двовим≥рним масивом, варто використовувати або ≥ндекси масиву, або ≥ндекси покажчик≥в, наприклад, €кщо описаний список пр≥звищ

 

char spis [5] [15];,

 

то дл€ використанн€ символу масиву варто записати:

spis [i] [j] або *(spis [i] + j).

јналог≥чно при оголошенн≥ масив≥в покажчик≥в char *str [5] (указуЇ на 5 елемент≥в, кожний з €кий указуЇ на р€док), а доступ до символу р€дка можна зд≥йснити, записавши *(str [i]+j).

3.2.3 ¬веденн€-виведенн€ символьних масив≥в

 

–€дки можна вводити р≥зними способами, найб≥льш розповсюдженими з €ких Ї:

¾ введенн€ шл€хом ≥н≥ц≥ал≥зац≥њ при оголошенн≥ строкових масив≥в:

 

char st [5] = " —т≥л";

char st [] = " —т≥л";

char *pst = " —т≥л";

у цьому випадку двовим≥рн≥ масиви можна ≥н≥ц≥ал≥зувати одним з наступних засоб≥в:

 

char str [5] [20] = {"≤ванов ».». ", "—идоров —.—. ",...,};

char str [ ] [20] = {"≤ванов ».». ", "—идоров —.—. ",...,};

char *pst [5] = {"≤ванов ».». ", "—идоров —.—. ",...,};

char *pst [ ] = {"≤ванов ».». ", "—идоров —.—. ",...,};

¾ введенн€ за допомогою оператора cin >>, €кщо в р€дку немаЇ пром≥жк≥в, тому що символ пром≥жок Ї розд≥льником вводу даних, наприклад:

 

char st [5]; cin >> st;

char *pst; cin >> *pst

char str [5] [20]; cin >> str [i];

char *pst [5]; cin >> (pst [i]);

¾ посимвольне уведенн€ за допомогою функц≥њ get(), наприклад get(st[i]);

¾ за допомогою функц≥њ cin.get (str [i], size, endl);,

де size - к≥льк≥сть символ≥в, що читаютьс€;

¾ уведенн€ за допомогою функц≥њ cin.getline (str [i], sizeof (str [i]));,

де sizeof() - функц≥€ визначенн€ розм≥ру р€дка.

 

¬иводити строков≥ дан≥ можна використовуючи наступн≥ записи:

 

cout << st;

printf (У% sФ,st); // або (sprintf)

puts (st); cout. write (st, size); ≥ ≥н.

 

ѕриклад 3.3 —писок р€дк≥в (пр≥звища ≥ ≥н≥ц≥али ¾ ‘.».ќ.) оголошений €к масив покажчик≥в. —класти програму, що реал≥зуЇ введенн€ масиву по р€дках ≥ посимвольне виведенн€ цього масиву.

 

// P3_3.—–– Ч список р€дк≥в оголошений €к масив покажчик≥в

#include <stdio.h>

Void main (void)

{

char *psp[ ] = { "јвдЇЇв ј.ј.'',

"ѕетров ѕ.ѕ.",

"Ћисиц€ Ћ.Ћ. ",

NULL };

char **ptr =psp;

// ¬иведенн€ масиву по р€дках

while (*ptr)

puts (*ptr++);

ptr=psp;

// ¬иведенн€ цього масиву посимвольне

while (*ptr)

{

while (**ptr)

{ putchar(**ptr); (*ptr)++; }

ptr++

}

}

ѕ≥д час використанн€ заголовного файлу stdio.h можна також застосувати, наприклад, так≥ функц≥њ:

 

дл€ введенн€ р€дк≥в дл€ виведенн€ р€дк≥в

 

puts(st);printf(%s, st);

Gets(st); cout.width(w);

scanf (У% sФ,st); cout.precision (d);

Setw(w);

Setprecision(d);

3.2.4 ќсновн≥ функц≥њ обробки символьних тип≥в

 

” ранн≥х верс≥€х —++ р€дки розгл€далис€ €к символьн≥ масиви ≥ робота з ними ірунтувалас€ на використанн≥ цих масив≥в. –озроблена б≥бл≥отека функц≥й <string.h> м≥стить могутн≥ засоби дл€ роботи з≥ строковими масивами. «годом була розроблена стандартна б≥бл≥отека шаблон≥в Standard Template Library (STL), що надаЇ ще б≥льш могутн≥ засоби роботи з р€дками, об'Їднан≥ в клас string. ÷ей клас включаЇтьс€ €к заголовний файл, тобто:

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

 

ƒл€ обробки символьних тип≥в даних б≥бл≥отека функц≥й <string.h> маЇ велику к≥льк≥сть вбудованих функц≥й, що зб≥льшують продуктивн≥сть прац≥ програм≥ст≥в ≥ скорочують час на розробку програм. ÷€ б≥бл≥отека м≥стить так≥ функц≥њ, €к наприклад:

 

функц≥њ перев≥рки символ≥в;

≠ функц≥њ перетворенн€ символ≥в;

функц≥њ перев≥рки р€дк≥в;

функц≥њ ман≥пулюванн€ р€дками.

”с≥ ц≥ функц≥њ привод€тьс€ у вигл€д≥ списк≥в, згрупованих по њх розташуванню в заголовних файлах. Ќайчаст≥ше привод€тьс€ прототипи функц≥й, що описують, €ким образом використовувати функц≥њ в програмах.

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

 

¾  оп≥юванн€ р€дк≥в

char strcpy (s, *st); ¾ коп≥юЇ байти р€дка s t у р€док 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); ¾ поЇднуЇ st1st2 ≥ повертаЇ 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); - пор≥внюЇ р€дки st1st2 ≥ повертаЇ ц≥лу величину, р≥вну:

< 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 у st1st2 ≥ повертаЇ ц≥лу величину:

< 0 ¾ €кщо st1 < st2;

= 0 ¾ €кщо st1 = st2;

> 0 ¾ €кщо st1 > st2;

 

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

 

¾ ѕеретворенн€ символ≥в р€дка

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;

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

{

char st [n], st1 [m];

cout << "¬вед≥ть р€док"<< endl;

Cin. getline(st,n);

cout << "¬вед≥ть п≥др€док"<< endl;

cin >> st1;

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

{





ѕоделитьс€ с друзь€ми:


ƒата добавлени€: 2015-11-05; ћы поможем в написании ваших работ!; просмотров: 366 | Ќарушение авторских прав


ѕоиск на сайте:

Ћучшие изречени€:

ƒва самых важных дн€ в твоей жизни: день, когда ты по€вилс€ на свет, и день, когда пон€л, зачем. © ћарк “вен
==> читать все изречени€...

2040 - | 1892 -


© 2015-2024 lektsii.org -  онтакты - ѕоследнее добавление

√ен: 0.108 с.