C++

Sətirlər

Sətirlər

Sətirlər cərgələrin xüsusi halıdır. Cərgə elementlərinin tipinin char olduğu hal. char tipi simvol tipi adlanır. Başqa sözlə, sətirlər simvollar cərgəsidir. Sətirlərin tətbiq sahəsi çox genişdir, həm nüvədə, həm də istifadəçi proqramlaşdırmasında sətirlərdən çox geniş istifadə olunur. Elementlərinin hər biri 1 bayt yer tutduğuna görə, müxtəlif məqsədlər üçün yaddaşda istənilən ölçülü yer ayırmaq lazım olanda, həmin ölçülü sətir elan edib bu sətirdən bufer kimi istifadə edə bilərik. İstənilən məlumat baytlar ardıcıllığı olduğundan, sətir kimi elan etdiyimiz yerə istənilən məlumat yaza bilərik.

Proqramda sətir elan etmənin 2 yolu var: char tipindən olan ünvan dəyişəni və ya cərgə elan etməklə.

Aşağıdakı kimi:

char setir1[100], *setir2;

Burada bizim üçün yeni heç nə yoxdur, bildiyimiz cərgə və ünvan dəyişəni elan etmişik. Sadəcə tip char olduğundan sətirlər üçün bir neçə standart funksiya təyin edilmişdir. Bu funksiyalardan istifadə edə bilmək üçün string.h faylını proqrama əlavə etməliyik.

 

7.1 Sətirlərə qiymətlərin mənimsədilməsi

Sətirlərə qiymətlər müxtəlif yollarla mənimsədilir: Adi (biz bildiyimiz) cərgənin hər bir elementinə qiymət mənimsətmə yolu ən az istifadə olunandır. Misal üçün, 20 simvoldan ibarət sətir elan edək, daha sonra bu sətrə "Azərbaycan" sözünü yerləşdirək. Bir daha qeyd edirəm ki, bu qayda ilə sətrə qiymət mənimsədilmir, bir azdan bunun asan qaydasını göstərəcəyik. Sadəcə sətirlərlə cərgələrin əlaqəsini göstərmək üçün bu misalı veririk.


char set[20];
set[0] = 'A';
set[1] = 'z';
set[2] = 'ə';
set[3] = 'r';
set[4] = 'b';
set[5] = 'a';
set[6] = 'y';
set[7] = 'c';
set[8] = 'a';
set[9] = 'n';
set[10] = '\0';

Bu nümunədə sətrin sonuncu elementinə mənimsətdiyimiz '\0' simvolu xüsusi simvoldur və sətirlərin sonunu bildirmək üçün istifadə olunur. Aşağıda daxil edəcəyimiz sətir funksiyaları sətrin sonunu bu simvola görə təyin edir. Belə ki, sətir funksiyaları sətirdə '\0' simvoluna rast gəldikləri yerdən sətrin qalan hissəsini inkar edirlər.

Bu misalda sətirlərin adi char tipindən olan cərgə olmaları aydın görülür. Yuxarıdakı set sətrinə "Azərbaycan" sözünü biz asanlıqla elanda

char set[]="Azərbaycan";

kimi də mənimsədə bilərdik. Amma bu da sətirlərə qiymət mənimsətmək üçün əsas qayda deyil.

strcpy() funksiyası

Sətirlərə qiymət mənimsətmək üçün ən əsas istifadə olunan funksiya strcpy() funksiyasıdır. Bu yerdə sizin diqqətinizə xüsusi bir məsələni mütləq çatdırmalıyam. Şəbəkə hücumlarının geniş yayılmış müxtəlif növləri var. Bunlara DOS (Denial of Service - Xidmətdən imtina), Buffer Oveflow (Buferi daşırmaq) və digərlərini misal göstərmək olar.

C++ dilində yazılmış proqramların zəif tərəflərindən biri strcpy() funksiyasıdır. Belə ki, pis məqsədli hər kimsə, strcpy() funksiyasına parametr olaraq böyük olçülü sətir verə bilər. Nəticədə strcpy() həmin sətri göstərilən ünvandan proqramın daxilinə köçürəndə proqramın bütün ehtiyat yaddaşın doldurar və nəticədə proqram dayanmağa məcbur olar. Çıxış yolu strcpy() əvəzinə strncpy() funksiyasından istifadə etməkdir.

strncpy() funksiyası verilmiş ünvandan ən çoxu verilmiş sayda simvol köçürməyə icazə verir. Sadə məsələlərdə strcpy()-dən istifadə edə bilərsiniz, amma ciddi proyektlərdə mütləq strncpy()-dən istifadə etmək lazımdır.

strcpy() funksiyasının sintaksisi aşağıdakı kimidir:


char * strcpy(char *menseb, char *menbe);

Burada menbe köçürüləcək sətrin ünvanı, menseb sətri köçürmək istədiyimiz ünvandır.

Proqram nümunəsi:


// prg_7_1.cpp

#include <iosteram>
#include <string.h>

int main()
{
//15 simvoldan ibarət sətir elan edirik
char set[15];

strcpy(set,"Ekvator");
std::cout<<set;

return 0; 
}

Nümunə

strlen() funksiyası.

int strlen(char *s);

Bu funksiya s sətrində olan simvolların (baytların) sayını qaytarır. '\0' simvolunu hesaba almır.

strncpy() funksiyası.

char * strncpy(char *s1, char *s2, int n);

s2 sətrinin ilk n elementini s1-ə köçürür(s1-in əvvəlindən başlayaraq).

Qeyd: bu funksiya sətrin sonuna '\0' simvolunu yazmır.

strcmp() funksiyası.

int strcmp(char *s1, char *s2);

Bu funksiyadan sətirlərin müqayisəsi üçün istifadə edirlər. Əgər s1 sətri s2 sətri ilə eynidirsə, onda funksiya 0 qiymətini qaytarır. Əgər s1-in elementlərinin sayı s2-dən azdırsa, onda <0, əks halda >0 qiymətini qaytarır.

strcat() funksiyası.

char * strcat (char *s1, char *s2);

Bu funksiya s1-in sonuna s2-ni əlavə edir.

 

Proqram nümunələri:

Proqram 1:

İstifadəçinin daxil etdiyi sətrin uzunluğunu ekranda çap edən proqram tərtib edək.


// prg_7_2.cpp

#include <iostream>
#include <string.h>

int main()
{

char set[1024];
int k;

std::cout<<"Zəhmət olmasa, hər hansı sətir daxil edin \n";
std::cin>>set;
k = strlen(set);
std::cout<<"Sizin daxil etdiyiniz sətrin simvollarının sayı "<<k<<" \n";
return 0;
}

Nümunə

Proqramı icra edək:


C:\cpp\prog2\Debug> 
C:\cpp\prog2\Debug>./prog2.exe 
Zəhmət olmasa, hər hansı sətir daxil edin
Olimpiada 
Sizin daxil etdiyiniz sətrin simvollarının sayı 9
C:\cpp\prog2\Debug> 
C:\cpp\prog2\Debug>

Proqram 2.

Elə proqram qurun ki, istifadəçinin daxil etdiyi sətrin 10-cu simvolundan başlayaraq, yerdə qalan hissəsini çap etsin. Əgər sətrin uzunluğu 10-dan kiçikdirsə, onda proqram ekranda bütöv sətri çap etsin.


// prg_7_3.cpp

#include <stdio.h>
#include <string.h>

int main(){

char set[1024];
int k;

std::cout<<"Zəhmət olmasa, hər hansı sətir daxil edin \n";
std::cin>>set;
k = strlen(set);

if (k<10)
std::cout<<set<<"\n";
else 
{ 
char *p = set;
p+=10;
std::cout<<p<<"\n";
}

return 0;
}

Nümunə

Proqramı icra edək:


C:\cpp\prog2\Debug> 
C:\cpp\prog2\Debug>./prog2.exe
Zəhmət olmasa, hər hansı sətir daxil edin
SerguzeshtiVeziriXaniLenkeran
iVəziriXaniLənkəran
C:\cpp\prog2\Debug> 
C:\cpp\prog2\Debug>