Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Joqari darejeli programmalastiriwda C++ Last

.pdf
Скачиваний:
8
Добавлен:
03.12.2023
Размер:
2.03 Mб
Скачать

strncpy() funkciyasınıń strlen() funkciyasınan parıqlı jeri sonnan ibarat, onda bir qatardan ekinshisine nusqalanatuǵın belgiler sanı kórsetiledi. Onıń prototipi tómendegi kóriniske iye:

char* strncpy(char *str1, const char *str2, size_t num);

Eger str1 qatar uzınlıǵı str2 uzınlıǵınan kishi bolsa, artıqsha belgiler “kesip” taslanadı. strncpy() funkciyasınıń isletiliwine mısal keltireyik:

#include <iostream.h> #include <string.h> int main()

{

char Uzın_str[] = "01234567890123456789"; char Qısqa_str[] = "ABCDEF"; strncpy(Qısqa_str, Uzın_str, 4);

cout << "Uzın_str = " << Uzın_str << endl; cout << "Qısqa_str = " << Qısqa_str << endl; return 0;

}

Programmada Uzın_str qatarı basınan 4 belgi Qısqa_str qatarına, onıń aldınǵı mánisleri ústine jaylasadı hám nátiyjede ekranǵa

01234567890123456789

0123EF

qatarlar shıǵarıladı.

strdup() funkciyasına jalǵız uzatıladı. Funkciya qatarǵa sáykes hám júzege kelgen qatar-nusqa funkciyası sintaksisi:

parametr sıpatında qatar deregine kórsetkish yadtan orın ajıratadı, oǵan qatardı nusqalaydı adresin juwap sıpatında qaytaradı. strdup()

char* strdup(const char* source)

Tómendegi programma bóleginde qatar1 qatardıń nusqası yadtıń qatar2 kórsetken jerinde payda boladı:

char *qatar1 = ”Qatar nusqasın alıw.”;

char* qatar2;

qatar2 = strdup(qatar1);

131

8.4. Qatarlardı jalǵaw

Qatarlardı jalǵaw (konkatenaciya) ámeli jańa qatarlardı payda etiwde keń qollanıladı. Bul maqsette «string.h» kitapxanasınan strcat() hám strncat() funkciyaları anıqlanǵan.

strcat() funkciyası sintaksisi tómendegi kóriniske iye:

char* strcat(char *str1, const char *str2)

Funkciya islewi nátiyjesinde str2 qatar, funkciya qaytarıwshı qatar – str1 qatar izine jalǵanadı. Funkciyanı shaqırıwdan aldın str1 qatar uzınlıǵı, oǵan str2 qatarı jalǵanıwı ushın jeterli bolıwı esapqa alınǵan bolıwı kerek.

Tómende keltirilgen ámeller izbe-izliginiń orınlanıwı nátiyjesinde qatar qatarına qosımsha qatar jalǵanıwı kórsetilgen:

char qatar[80];

strcpy(qatar, ”bul qatarǵa”);

strcat(qatar, ”qatar astı jalǵanadı.”);

Ámeller izbe-izliginiń orınlanıwı nátiyjesinde qatar kórsetip atırǵan orında “Bul qatarǵa qatar astı jalǵanadı” qatarı payda boladı.

strncat() funkciyası strcat() funkciyasınan parıqlı túrde str1 qatarǵa str2 qatarınıń kórsetilgen uzınlıqtaǵı qatar bólegin jalǵaydı. Jalǵanatuǵın qatar bólegi uzınlıǵı funkciyanıń úshinshi parametri sıpatında beriledi.

Funkciya sintaksisi:

char* strncat(char *str1, const char *str2, size_t num)

Tómende keltirilgen programma bóleginde str1 qatarına str2 qatarınıń

baslanǵish 10 belgiden ibarat qatar bólegi jalǵanadı:

char qatar1[80] = ”programmalastırıw tillerine misal bul-“;

char qatar2[80] = ”C++, Pascal, Basic”;

strncat(qatar1, qatar2, 10);

cout << qatar1;

Ámeller orınlanıwı nátiyjesinde ekranǵa

programmalastırıw tillerine misal bul-C++, Pascal

qatarı shıǵarıladı.

132

Másele. Nol-terminator menen tawsılıwshı S, S1 hám S2 qatarlar berilgen. S qatardaǵı S1 qatar astıları S2 qatar astı menen almastırılsın. Máseleni sheshiw ushın tómendegi másele astıların sheshiw zárúr boladı:

1.S qatarında S1 qatar astınıń kiriw ornın anıqlaw;

2.S qatarınan S1 qatar astın óshiriw;

3.S qatarında S1 qatar astı ornına S2 qatar astın ornatıw.

Bul másele astılarınıń sheshimleri C++ tiliniń standart kitapxanalarında funkciyalar kórinisinde bar bolsa da, olardıń kodın qayta jazıw paydalanıwshıǵa bul

ámellerdiń ishki mánislerin túsiniwge imkan beredi. Tómende másele sheshiminiń programma teksti keltirilgen:

#include <iostream.h> #include <string.h> const int n = 80;

int Izlew(char *,char *);

void Qırqıw(char *, int, int);

void Jaylastırıw(char *, char *, int); int main()

{

char Qatar[n], Qatar1[n], Qatar2[n]; cout << "Qatardı kiritiń: "; cin.getline(Qatar, n);

cout << "Almastırılatuǵın qatar astın kiritiń: "; cin.getline(Qatar1, n);

cout << Qatar1 << " Qoyılatuǵın qatardı kiritiń: "; cin.getline(Qatar2, n);

int qatar1_uzınlıǵı = strlen(Qatar1); int qatar_astı_ornı;

do

{

qatar_astı_ornı = Izlew(Qatar, Qatar1); if(qatar_astı_ornı != -1)

{

133

Qırqıw(qatar, qatar_astı_ornı, qatar1_uzınlıǵı);

Jaylastırıw(Qatar, Qatar2, qatar_astı_ornı);

}

}while(qatar_astı_ornı != -1);

cout << "Almastırıw nátiyjesi: " << Qatar; return 0;

}

int Izlew(char qatar[], char qatar_astı[])

{

int qatar_parıqı = strlen(qatar) - strlen(qatar_astı); if(qatar_parıqı >= 0)

{

for(int i = 0; i <= qatar_parıqı; i++)

{

bool ústi_ústine = true;

for(int j=0; qatar_astı[j]!=’\0’&&ústi_ústine;

j++)

if(qatar[i + j] != qatar_astı[j])

ústi_ústine = false; if(ústi_ústine)

return i;

}

}

return -1;

}

void Qırqıw(char qatar[], int orın, int qırqıw_sanı)

{

int qatar_uzınlıǵı = strlen(qatar); if(orın < qatar_uzınlıǵı)

{

if(orın + qırqıw_sanı >= qatar_uzınlıǵı) qatar[orın] = '\0';

else

134

for(int i = 0; qatar[orın + i - 1] != '\0';

i++)

qatar[orın + i] = qatar[orın + qırqıw_sanı+i];

}

}

void Jaylastırıw(char qatar[], char qatar_astı[], int orın)

{

char waqtınsha[n]; strcpy(waqtınsha, qatar + orın); qatar[orın] = '\0'; strcat(qatar, qatar_astı); strcat(qatar, waqtınsha);

}

Programmada hár bir másele astına sáykes funkciyalar dúzilgen:

1. int Izlew(char qatar[], char qatar_astı[]) – funkciyası qatar qatarına qatar_astı qatarınıń shep tárepinen birinshi kiriwiniń ornın qaytaradı. Eger qatar qatarında qatar_astı ushıramasa -1 mánisin qaytaradı.

2. void Qırqıw(char qatar[], int orın, int qırqıw_sanı) – funkciyası qatar qatarınıń orın ornınan baslap qırqıw_sanı sandaǵı belgilerdi qırqıp taslaydı. Funkciya nátiyjesi qatar qatarında payda boladı.

3. void Jaylastırıw(char qatar[], char qatar_astı[], int orın) – funkciyası qatar qatarına, onıń orın ornınan baslap qatar_astı qatarın jaylastıradı.

Bas funkciyada qatar (S), onda almastırılatuǵın qatar (S1) hám S1 ornına jaylastırılatuǵın qatar (S2) aǵımınan oqıladı. Tákirarlaw operatorı orınlanıwınıń hár bir qádeminde S qatarınıń shep tárepinen baslap S1 qatarı izlenedi. Eger S qatarında S1 qatarı bar bolsa, ol qırqıladı hám sol orınǵa S2 qatarı jaylastırıladı. Tákirarlaw processi Izlew() funkciyası -1 mánisin qaytaraman degenshe dawam etedi.

8.5. Qatarlardı salıstırıw

Qatarlardı salıstırıw olardaǵı sáykes orında jaylasqan belgiler kodların óz-ara salıstırıw menen anıqlanadı. Bunıń ushın «string.h» kitapxanasında standart

funkciyalar bar. strcmp() funkciyası sintaksisi:

135

int strcmp(const char *str1, const char *str2)

kórinisine iye bolıp, funkciya str1 hám str2 salıstırıw nátiyjesi sıpatında san mánisin qaytaradı hám olar tómendegishe ańlatıladı:

a)i < 0 - eger str1 qatarı str2 qatarınan kishi bolsa;

b)i = 0 - eger str1 qatarı str2 qatarına teń bolsa;

c)i > 0 - eger str1 qatarı str2 qatarınan úlken bolsa.

Funkciya háriplerdiń registrin parıqlaydı. Bunı mısalda kóriwimiz múmkin:

char qatar1[80] = ”Programmalastırıw tilleri: C++, pascal.“;

char qatar2[80] = ”Programmalastırıw tilleri: C++, Pascal.“;

int i;

i = strcmp(qatar1, qatar2);

Nátiyjede i ózgeriwshisi oń mánis qabıl etedi, sebebi salıstırılıp atırǵan qatarlardaǵı “pascal” hám “Pascal” qatar bóleklerinde birinshi háripler parıq qıladı. Keltirilgen mısalda i mánisi 32 boladı. Bul parıqlanıwshı háripler kodlarınıń ayırması. Eger funkciyaǵa

i = strcmp(qatar2, qatar1);

kórinisinde múráját etilse, i mánisi teris san -32 boladı.

Eger qatarlardaǵı bas yamasa kishi háriplerdi parıqlamastan salıstırıw ámelin orınlaw zárúr bolsa, bunıń ushın strcmpi() funkciyasınan paydalanıw múmkin.

Joqarıda keltirilgen mısaldaǵı qatarlar ushın

i = strcmpi(satr2, satr1);

ámeli orınlanǵanda i mánisi 0 boladı. strncmp() funkciyası sintaksisi

int strncmp(const char *str1, const char *str2, size_t num);

kórinisinde bolıp, str1 hám str2 qatarlardı baslanǵısh num sanındaǵı belgilerdi salıstıradı. Funkciya háripler registrin itibarǵa aladı. Joqarıdaǵı mısalda anıqlanǵan qatar1 hám qatar2 qatarlar ushın

i = strncmp(qatar1, qatar2, 31);

ámeli orınlanıwında i mánisi 0 boladı, sebebi qatarlar basindaǵı 31 belgiler birdey.

136

strncmpi() funkciyası strncmpi() funkciyasınday orınlanadı, ózgeshe tárepi sonnan ibarat, salıstırıwda háriplerdiń registri esapqa alınbaydı. Dál usı qatarlar ushın

i=strncmpi(qatar1, qatar2, 32);

ámeli orınlanıwı nátiyjesinde i ózgeriwshi mánisi 0 boladı.

8.6. Qatardaǵı háripler registrin almastırıw

Berilgen qatardaǵı kishi háriplerdi bas háriplerge yamasa kerisinshe almastırıwǵa sáykes túrde _strupr() hám _strlwr() funkciyalar járdeminde ámelge asırıw múmkin. Kompilyatorlardıń ayrım variantlarında funkciyalar atındaǵı tómengi sızıq (‘_’) bolmawı múmkin.

_strlwr() funkciyası sintaksisi

char* _strlwr(char *str);

kórinisinde bolıp, argument sıpatında berilgen qatardaǵı bas háriplerdi kishi háriplerge almastıradı hám payda bolǵan qatar adresin funkciya nátiyjesi sıpatında qaytaradı. Tómendegi programma bólegi _strlwr() funkciyasınan paydalanıwǵa mısal boladı.

char str[] = ”10 DANA ÚLKEN HÁRIPLER”;

_strlwr(str);

cout << str;

nátiyjede ekranǵa

10 dana úlken háripler

qatarı shıǵarıladı.

_strupr() funkciyası dál _strlwr() funkciyasınday orınlanadı, biraq qatardaǵı kishi háriplerdi bas háriplerge almastıradı:

char str[] = “10 dana úlken háripler”;

_strupr(str);

cout << str;

nátiyjede ekranǵa

10 DANA ÚLKEN HÁRIPLER

qatarı shıǵarıladı.

137

Programmalastırıw ámelıyatında belgilerdiń qaysı aralıqqa tiyisli ekenligin biliw zárúr boladı. Bunı «ctype.h» baslama faylında járiyalanǵan funkciyalar járdeminde anıqlaw múmkin. Tómende olardıń bir bóleginiń anıqlaması keltirilgen:

isalnum() – belgi, cifr yamasa hárip (true) yamasa joqlıǵın (false) anıqlaydı; isalpha() – belginiń hárip (true) yamasa joqlıǵın (false) anıqlaydı;

isascii() – belginiń kodı 0..127 aralıǵında (true) yamasa joqlıǵın (false) anıqlaydı;

isdigit() - belginiń sanlar diapazonına tiyisli (true) yamasa joqlıǵın (false) anıqlaydı.

Bul funkciyalardan paydalanıwǵa mısal keltiremiz.

#include <iostream.h> #include <ctype.h> #include <string.h> int main()

{

char qatar[5]; int qáte;

do

{

qáte = 0;

cout << "\nTuwılǵan jılıńızdı kiritiń: "; cin.getline(qatar, 5);

for(int i = 0; i < strlen(qatar) && !qáte; i++)

{

if(isalpha(qatar[i]))

{

cout << "Hárip kiritildi!"; qate = 1;

}

else if(iscntrl(qatar[i]))

{

cout << "Basqarıw belgisi kiritildi!"; qáte = 1;

138

}

else if(ispunct(qatar[i]))

{

cout << "Punktuaciya belgisi kiritildi!"; qáte = 1;

}

else if(!isdigit(qatar[i]))

{

cout << "Sannan parıqlı belgi

kiritildi!"; qáte = 1;

}

}

if(!qate)

{

cout << "Siziń tuwılǵan jılıńız: " << qatar; return 0;

}

}while (1);

}

Programmada paydalanıwshıǵa tuwılǵan jılın kiritiw usınıs etiledi. Kiritlgen sáne qatar ózgeriwshisine oqıladı hám eger qatardıń hár bir belgisi (qatar[i]) hárip yamasa basqarıw belgisi yaki punktuaciya belgisi bolsa, sol haqqında xabar beriledi hám tuwılǵan jıldı qayta kiritiw usınıs etiledi. Programma tuwılǵan jıl (tórt san) durıs kiritilgende “Siziń tuwılǵan jılıńız XXXX” qatarın shıǵarıw menen óz jumısın tamamlaydı.

8.7. Qatardı keri tártiplestiriw

Qatardı keri tártiplestiriw ushın strrev() funkciyasınan paydalanıw múmkin. Bul funkciya tómendegishe prototipke iye:

char* strrev(char *str);

Qatar reversin payda etiwge mısal:

char str[] = ”telefon”;

139

cout << strrev(str);

ámeller orınlanıwı nátiyjesinde ekranǵa

nofelet

qatarı shıǵarıladı.

8.8. Qatarda belgini izlew funkciyası

Qatarlar menen islewde ondaǵı qandayda bir belgini izlew ushın «string.h» kitapxanasında bir qatar standart funkciyalar bar.

Qanday da bir belginiń berilgen qatarda bar yamasa joq ekenligin anıqlap beriwshi strchr() funkciyasınıń prototipi

char* strchr(const char *string, int c);

kórinisinde bolıp, ol c belgisin string qatarında izleydi. Eger izlew sátli bolsa, funkciya sol belginiń qatardaǵı ornın funkciya nátiyjesi sıpatında qaytaradı, keri jaǵdayda, yaǵnıy belgi qatarda ushıramasa funkciya NULL mánisin qaytaradı. Belgini izlew qatar basınan baslanadı.

Tómende keltirilgen programma bólegi belgini qatardan izlew menen baylanıslı.

char qatar[] = ”0123456789”;

char *pQatar;

pQatar = strchr(qatar, ’6’);

Programma islewi nátiyjesinde pQatar kórsetkishi qatar qatarınıń “6” belgisi jaylasqan ornı adresin kórsetedi.

strrchr() funkciyası berilgen belgini berilgen qatar aqırınan baslap izleydi. Eger izlew sátli bolsa, belgini qatarǵa aqırǵı kiriwiniń ornın qaytaradı, keri jaǵdayda NULL mánis qaytaradı.

Mısal ushın

char qatar[] = ”0123456789101112”;

char *pqatar;

pqatar = strrchr(qatar,’0’);

ámeller orınlanıwında pqatar kórsetkishi qatar qatarınıń “01112” qatar bóleginiń

baslanıwın kórsetedi.

140