You are on page 1of 48

 Stringat në gjuhën C janë vektorë me përmbajtje

të tipit karakter (char), pra një varg karakteresh.


 Ato përdoren për të ruajtur dhe përpunuartekst,
si fjalët, emrat, fjalitë, etj.
 Në gjuhën C, ndryshe nga shumë gjuhë të tjera si
Pascali, Basic, etj, stringat nuk janë një tip më
vete të dhënash.
 Fundi i stringës sinjalizohet nga karakteri null me
simbolin ‘\0’ (backslash dhe numri 0). Vlera
numerike e tij është 0.
 Variablat stringa
 Konstantet stringa
 Te dyja jane bashkesi karakteresh vendosur ne nje
vektor.

Dallojne nga:
 1. Menyra e deklarimit:
const char a[10]; per konstatet
char b[10]; per variablat
 2. Stringa e shprehur si konstante nuk mund t’i
ndryshohet vlera, ndersa asaj variabel po.
 Psh:
b[3] = ‘z’ eshte veprim i lejuar; por
a[3] = ‘z’ nxjerr mesazh gabimi.
 Sekuence karakteresh midis thonjëzave dyshe.
 Shembull: kur thërrasim funksionin
printf(“%s”,“Përshëndetje!”)
 Gjuha C i trajton konstantet string si vektor
karakteresh.
 Çdo karakter i një stringu zë një byte në memorie.
 Nëse konstantja string ka n karaktere, rezervohen në
memorjen+1byte për arsye te karakterit null.
 Ky karakter është krejtësisht i ndryshëm nga
karakteri ‘0’
◦ Karakteri „0‟ ka kodin ASCII 48
◦ Karakteri „\0‟ ka kodin ASCII 0.
 Një stringë që nuk mbaron me këtë karakter nuk
është një stringë në kuptimin e plotë të fjalës, por
vetëm një bashkësi karakteresh.
/* string.c */
/*lexon në string nga tastiera dhe e afishon atë */
#include <stdio.h> /*përfshin funk.
printf(),scanf()*/
void main(void)
{
char emri[15]; /*vektori ku ruhet emri */
printf(“\nShkruani emrin tuaj: “);
scanf(“%s”, emri);
printf(“Përshëndetje, %s.”, emri);
}

Shembull i ekzekutimit të programit:


Shkruani emrin tuaj: Erida
Përshëndetje, Erida.
 Konstantja string: “abc” ruhet ne memorje ne
formen:

 Konstantja string: “” ruhet ne memorje:

 Meqe nje konstante string ruhet si nje matrice,


kompilatori e trajton si pointer te tipit char *

7
 Nje stringe qe mban nje karakter te vetem nuk
eshte e njejte me nje karakter.
 Karakteri kufizohet me simbolet apostrofa,
stringa me thonjezat.
 Stringa me nje karakter ndiqet nga karakteri null,
karakteri eshte njesi e vetme.
 Psh. stringa “a” perfaqeson nje pointer ne nje
zone te kujteses ku eshte ruajtur karakteri a dhe
karakteri null. Per ta afishuar a-ne:
 printf (‘a’); //GABIM, mund te printosh stringen
printf(“a”) por jo karakterin a ne kete forme.
 Karakteri ka nje vlere te njevlershme numerike
int (kodi ASCII i tij), kurse stringa nuk ka numer
int te njevlershem).
8
 Para se të përdoren, stringave u duhet rezervuar
vendi në kujtesë për ruajtjen e tyre.
 Për to rezervohen aq byte në memorie sa është
dhe numri i karaktereve që i përbëjnë.
 Në programin string.c vektori emri është
deklaruar me 15 karaktere, mos të harrojmë se
karakteri i fundit do të jetë ‘\0’.
 Kur funksioni scanf() lexon emrin nga tastiera, i
shton në fund karakterin ‘\0’ para se të bëhet
ruajtja në memorie, kështu që nëse vektori
përbëhet nga 15 karaktere në të mund të ruani
një stringë që ka jo më shumë se 14 karaktere.
 Shembull:
char date1 [8] = “June 14”;
 Karakteri i fundit: karakteri null

char date2 [9] = “June 14”;

10
 2 funksione kryesore: scanf() dhe gets().

 Në funksionin scanf(), perdoret specifikuesi


%s dhe mungon operatori & përpara emrit të
stringut:
◦ scanf(“%s, emri);
 Adresa e stringës është vetë emri i tij, ndaj në
funksionin scanf() operatori & është i
panevojshëm.
 Funksioni scanf() ka disa kufizime në trajtimin e
stringjeve.
 Në shembullin string.c nëse shkruajmë Steffi Graf
ekzekutimi do jetë si më poshtë
Shkruani emrin tuaj: Steffi Graf
Përshëndetje Steffi.
 Megjithëse në variablin emri ne tentojmë të ruajmë
tërë shprehjen “Steffi Graf” pas ekzekutimit të
instruksionit printf(Përshëndetje, %s.”, emri);
 Afishohet vetëm emri dhe jo mbiemri. Cila është
arsyeja?
 Funksioni scanf() përdor çdo karakter
bosh([Enter], [Tab], [Space]) për të shënuar
fundin e variablit që po regjistrohet
 Në rastin tonë hapesira bosh ndërmjet emrit
dhe mbiemrit konsiderohet si fundi i
variablit emri, pra në të është regjistruar
vetëm fjala “Steffi”.
 Si përfundim funksioni scanf() është i
papërdorshëm nëse duam të ruajmë në një
variabël stringë të përbërë nga disa fjalë.
 Zgjidhja është përdorimi i një funksioni
tjetër nga biblioteka e pasur e gjuhës C dhe
pikërisht e funksionit gets().
 Ky funksion ndryshe nga funksioni scanf(),
është i specializuar vetëm në leximin e
stringjeve dhe jo të variablave të tipeve të
tjera.
 Vetëm shtypja e tastës [Enter] i tregon këtij
funksioni përfundimin e stringut, pasi
hapsirat bosh dhe tab-et konsiderohen si
pjesë të stringut.
 Funksioni gets():
◦ Merr një argument ( stringën ku do ruhet stringa
e lexuar )
◦ Ndalon së lexuari karaktere kur gjen një
rresht të ri.
◦ Nuk i injoron hapësirat përpara stringës.
◦ Vendos karakterin null në fund.
 Funksioni gets() ka korresponduesin e tij puts() që
shërben për afishimin në ekran të stringjeve.
 Funksioni puts() është i specializuar vetëm në
afishimin e stringjeve.
 Ndryshe nga funksioni printf() ai mund të afishojë
në një moment të caktuar vetëm një stringë, dhe
ashtu si dhe funksioni gets() nuk mund të
përcaktojë formatin e stringut para afishimit të tij.
 Funksioni puts():
◦ Merr vetëm një argument (stringën që do të
printohet).
◦ Në fund vendos një newline (rresht të ri).
/* getput.c */
/*lexon dhe afishon stringjet me funk. gets(), puts() */
#include <stdio.h> /*përfshin funk. gets(), puts()*/
void main(void)
{
char emri[81];
puts(“\nShkruani emrin tuaj: “);
gets(emri);/* lexon emrin nga tastiera */
puts(“Përshëndetje, ”);
puts(emri); /* afishon emrin */
}
 Nëse ekzekutojmë këtë program duke
shkruar të njejtin emër si në rastin e
programit string.c
Shkruani emrin tuaj:
Steffi Graf
Përshëndetje,
Steffi Graf

 Tashmë programi e ka ruajtur të gjithë emrin


dhe e afishon atë të plotë.
 Stringjet mund të inicializohen që në momentin e
deklarimit të tyre:
◦ char emri[] = {‘E’, ‘r’, ’i’, ‘s’, ‘\0’};
 Për inicializimin e stringjeve gjuha C përdor
gjithashtu dhe metodën e mëposhtme, e cila
duket qartë që është shumë më e thjeshtë si në
shkrim ashtu dhe në lexim.
◦ char emri[ ] = “Enis”;
 Theksojmë që kur inicializimi bëhet me mënyrën
e parë, çdo karakter vendoset brenda apostrofit (
‘ ), kurse në mënyrën e dytë i gjithë stringu
vendoset brenda thonjzave ( “ ).
 Në rastin e dytë karakteri ‘\0’ është i
panevojshëm meqë përdorimi i formatit të
stringut e vendos automatikisht atë.
/* inicializon, lexon dhe afishon stringje */
#include <stdio.c> /*përfshin funks. puts() gets() */
void main (void)
{
static char persh[ ]=“Përshëndetje,”; /*inicializimi*/
char emri [ 81]; /* stringu i painicializuar */
puts(“\nShkruani emrin tuaj: “);
gets(emri);
puts(persh);
puts(emri);
}
 Ekzekutimi i këtij programi do të jetë i njejtë me
ekzekutimin e programit getput.c megjithëse stringu
“Përshëndetje” nuk afishohet më si një konstante në
funksionin puts() por si vlerë e variablit persh.
 Meqë vektorët lokalë në gjuhën C nuk mund të
inicializohen veçse kur janë të tipit static, para deklarimit
të variablit persh, kemi përdorur fjalën çelës static.
 Funksioni puts() bën zëvendësimin automatik të karakterit
‘\0’ në fund të stringut me karakterin “e rreshtit të ri” ‘\r’.
Në këtë mënyrë pas çdo instruksioni puts() kalohet
automatikisht në rresht të ri.
 Kjo është arsyeja që pas ekzekutimit të instruksioneve :
puts(persh);
puts(emri)
 mesazhi i afishuar ka trajtën :
Përshëndetje,
Steffi Graf
 Le të shqyrtojmë me ndihmën e një shembulli
mënyrën e regjistrimit të një stringe në memorie dhe
të afishojmë rezultatet e gjetura.
/* strekzam.c shqyrton memorien e okupuar nga një
string */
#include <stdio.c> /*përfshin funk. gets(), printf() */
#include <string.h> /*përfshin funk. strlen() */
void main (void)
{
char emri [20];
int ind; /* indeksi i ciklit */
int gjatesia; /* gjatësia e stringut */
puts(“Shkruani emrin tuaj: “);
gets(emri);
gjatesia = strlen(emri); /* gjen gjatësinë e emrit */
for (ind=0; ind<gjatesia+4; ind++)
printf(“Adresa= %5u karakteri= ‘%c’ = %3d \n”,
&emri [ind], emri [ind], emri [ind]);
}
Ja një shembull i ekzekutimit të këtij programi:
Shkruani emrin tuaj:
Teuta
Adresa = 3486 karakteri=‘T’= 84
Adresa = 3487 karakteri=‘e’= 84
Adresa = 3488 karakteri=‘u’= 84
Adresa = 3489 karakteri=‘t’= 116
Adresa = 3490 karakteri=‘a’= 97
Adresa = 3491 karakteri=‘ ’= 0
Adresa = 3492 karakteri=‘<’= 60
Adresa = 3493 karakteri=‘#’= 35
Adresa = 3494 karakteri=‘u’= 117
 Në këtë program kemi përdorur operatorin & për të
marrë adresën e secilit nga karakteret që përbëjnë
stringun:
&emri[ind]
 Kemi përdorur gjithashtu një truk të vjetër
për të printuar një karakter në dy formate, si
karakter dhe si numër (%c,%d).
 Funksioni strlen(), gjendet në librarinë <string.h>
dhe kthen gjatësinë e një stringu.
 Në programin e shembullit 4 vlera e kthyer nga ky
funksion përdoret në ciklin for për të afishuar të
dhënat për stringun dhe 4 elementët që vijnë pas tij.
 Funksioni strlen() nuk e numëron karakterin e fundit
“null” (‘\0’) të një stringu.
 Gjuha C nuk ka operatore per te kryer
veprime me stringat.
 Ka funksione te gatshme tek libraria string.h
 Stringat jane matrica dhe duhet te trajtohen si
matrica.

char str1[10], str2[10];


str1 = “abc”; // GABIM
str2 = str1; // GABIM
if (str1 == str2) … // GABIM

25
 Disa funksione te librarise <string.h>
◦ strcpy(string1, string2);
◦ count2 = strlen(str2);
◦ strcat(str1, str2); ose strncat(str1, str2, 5);
◦ strcmp(str1, str2);
◦ strchr(str, c);
◦ strstr(text, word);
◦ strlen(str1);
 islower() Lowercase letter
 isupper() Uppercase letter
 isalpha() Uppercase or lowercase letter
 isalnum() Uppercase or lowercase letter or a digit
 iscntrl() Control character
 isprint() Any printing character including space
 isgraph() Any printing character except space
 isdigit() Decimal digit ('0' to '9')
 isxdigit() Hexadecimal digit ('0' to '9', 'A' to 'F', 'a' to 'f')
 isblank() Standard blank characters (space, '\t')
 isspace() whitespace character (space, '\n', '\t', '\v', '\r',
'\f')
 ispunct() Printing character for ëhich isspace() and
 isalnum() return false
 Meqë stringjet të vetme janë vektorë, një
vektor stringjesh nuk është gjë tjetër veçse
një matricë dypërmasore.
 Le të ilustrojmë përdorimin e një matrice të
tillë me ndihmën e programit krahaso.c i cili
kërkon nëse stringu i dhënë nga
përdoruesi ndodhet në një vektor të dhënë
stringjesh.
/* krahaso.c */
/* krahason stringun e dhënë me stringjet e një vektori */
#include <stdio.h> /* përfshin funk. printf(), gets() */
#include <stdio.h> /*përfshin funksionin strcmp() */
#define MAX 5 /*numri maksimal i stringjeve */
#define GJATESIA 40 /* gjatesia maksimale e stringut */
void main (void)
{
int ind; /* indeksi i ciklit */
int ugjet=0; /* ka vlerë 1 nëse stringu gjendet */
char emri [40];
char lista[MAX][GJATESIA] =
{ “Adriana”,
“Teuta”,
“Meritoni”,
“Françeska”,
“Dorina” };
printf(“\nSkruani emrin tuaj: );
gets(emri);
for (ind=0; ind<MAX; ind++)
if (strcmp(&lista[ ind ] [ 0 ],emri)==0)
{
ugjet = 1;
break;
}
if (ugjet == 1)
printf(“Ok, ju jeni në listë.”);
else
printf(“Kujdes! Ky person nuk ekziston!.”);
}
 Në varësi të faktit nëse emri i dhënë nga
përdoruesi ndodhet apo jo në listë do të kemi
dy variante të ekzekutimit të programit:

Shkruani emrin tuaj: Teuta


Ok, ju jeni në listë.
ose
Shkruani emrin tuaj: Anila
Kujdes! Ky person nuk ekziston!
 Renditja e indekseve në deklarimin e matricës
është gjithashtu shumë e rëndësishme:
char lista[MAX] [GJATESIA];
 Indeksi i parë MAX, përcakton numrin e
stringjeve që do të përmbajë matrica list,
ndërsa indeksi i dytë GJATESIA, përcakton
numrin e karaktereve të secilit string.
 Prototipi:
◦ int strcmp(const char str1, const char str2);
 Krahason stringat str1 dhe str2
 Nëse janë të barabarta kthen 0
 Nëse str1 më e vogël se str2 kthen -1 (kodi
ASCII i stringes 1 < kodi ASCII i stringes 2)
 Nëse str1 më e madhe se s2 kthen 1
 Shembull:
◦ “abc” eshte me e vogel se “dbc”
◦ “abc” eshte me e vogel se “abch”
◦ “ubc” eshteme e madhe se “abcdef”
 Programi fshirje.c demostron teknikën e
përdorur për të realizuar një fshirje të tillë me
ndihmën e një funksioni tjetër strcpy() të
bibliotekës string.h.
/* fshirje.c */ /*fshin një karakter të një stringu*/
#include <stdio.h> /* përfshin funk. printf(), gets() */
#include <string.h> /* përfshin funksionin strcmp() */
void strfshij(char str[ ], int n);
void main (void)
{
char string[81] ;
int pozicioni; /* poz. I karakterit që do të fshihet*/
printf(“\nJepni stringun [Enter] dhe pozicionin\n”);
gets(string); /* lexon stringun */
scanf(“%d”, &pozicioni); /* lexon pozicionin*/
strfshij(string, pozicioni); /*fshin karakterin */
puts(string); /*afishon stringun */
}
/* strfshij()*/
/*fshin një karakter të stringut, pasi çon pjesën e
dytë të tij një pozicion majtas */
void strfshij(char str[ ], int n)
{
strcpy(&str[n], &str[n+1]);
}
Ky program i kërkon përdoruesit një stringë dhe
pozicionin e karakterit që do të fshihet në të dhe
pasi fshin këtë karakter, afishon përsëri stringun
e modifikuar.
 Shembull i ekzekutimit të programit:
Jepni stringun [Enter] dhe pozicionin:
Sort
2
Sot
 Ky program ka fshirë nga fjala sort karakterin
e tretë (meqë numërimi fillohet nga zero).
 Funksioni strfshij() sposton me nga një
pozicion majtas të gjithë karakteret pas
karakterit që do të fshihet.
karakteri që
do të fshihet

s o r t \0

s o t \0 \0

&str[2]

strcpy(&str[2], &str[3])
 Prototipi:
char*strcpy (char str1,const char str2);
 Kopjon stringën str2 tek stringa str1
 Kthen pointer tek stringa destinacion
 Shembull:
◦ strcpy(str2,“abcd”);
 Shembull:
◦ strcpy(str1,str2);//str1tani mban“abcd”
◦ strcpy(str1,strcpy(str2,“abcd”));
◦ /*E SAKTE! Str1dhe str2 mbajnë“abcd”*/
 Në gjuhën C nuk mund të veprohët si në shumë gjuhë të tjera, ku për t’i
dhënë një variabli vlerën e një stringu, përdoret vlerëdhënia e
zakonshme:
◦ str=“Skënderbeu”;
 Pra, për një veprim kaq të thjeshtë në gjuhën C duhet të përdoret
funksioni strcpy().
 Ky funksion përmban dy argumanta: stringu që do të kopjohet është
argumenti i dytë, ndërsa stringu ku do të bëhet kopjimi është argumenti
i parë.
 Prototipi: int strlen(const char *s);
 Kthen numrin e karaktereve te stringes (pa
karakterin null)
 Shembull:
◦ Int j;
◦ j = strlen(“abc”); // j ka vleren 3
◦ j = strlen(“”); // j ka vleren 0
◦ strcpy(str1, “abc”);
◦ j = strlen(str1); // j ka vleren 3
 Prototipi:
char *strcat(char *str1, const char *str2);
 Përmbajtjen ë stringës str2 e shton në fund të
stringes str1 (bashkon 2 stringa).
 Shembull:
◦ strcpy(str1, “abc”);
◦ strcat(str1, “def”); // str1 permban“abcdef”
◦ strcpy(str1, “abc”);
◦ strcpy(str2, “def”);
◦ strcat(str1, str2); // str1 permban“abcdef”
◦ strcpy(str1, “abc”);
◦ strcpy(str2, “def”);
◦ strcat(str1, strcat(str2, “ghi”));
◦ /* str1 permban“abcdefghi”; str2 permban“defghi” */
 Shembull: Të ndërtohet një program që lexon
një stringë nga përdoruesi dhe afishon në
ekran numrin e herëve që përsëritet gërma a
në këtë stringë.
#include <stdio.h>
int main(void) {
char s[31];
int i, nr = 0;
printf(“Jepni nje stringe: ");
gets(s);
for (i= 0; i<strlen(s); i++)
if (s[i] == „a‟)
nr++;
printf(“Ne stringen %s germa a perseritet %d here.”, s, nr);
return 0;
}

 Ekzekutimi:
Jepni nje stringe : abc abc cab
Ne stringen abc abc cab germa a perseritej3 here.
char s1[ 50 ] = "jack", s2[ 50 ] = "abc", s3[ 50 ], *sptr;

printf( "%s", strcpy( s3, s2 ) );


printf( "%s", strcat( strcat( strcpy( s3, s1 ), " and " ), s2 ) );
printf( "%u", strlen( s1 ) + strlen( s2 ) );
printf( "%u", strlen( s3 ) );

44
char s1[ 50 ] = "jack", s2[ 50 ] = “abc", s3[ 50 ],*sptr;

printf( "%s", strcpy( s3, s2 ) ); // abc


printf( "%s", strcat( strcat( strcpy( s3, s1 ), " and " ), s2 ) );
//jack and abc
printf( "%u", strlen( s1 ) + strlen( s2 ) ); //7
printf( "%u", strlen( s3 ) ); //12

45
lexo_rresht: funksion i ndertuar per te lexuar n
karaktere te dhena nga tastjera dhe per ti ruajtur
ato tek stringa str. Kthen numrin e karaktereve te
lexuara.
int getchar(): lexon nje karakter nga tastjera
(funksion i librarise stdio.h)

int lexo_rresht (char str [ ], int n ){


int ch, i = 0;
while (( ch = getchar ()) != ‘\n’)
if (i <n)
str[i++] = ch;
str[i] = ‘\0’;
return i;
} 46
#include <stdio.h>
int main()
{
char str[100];
int i, fjale;
printf(“Jepni nje stringe: ");
gets(str);
i = 0;
fjale = 1;

while(str[i]!='\0')
{
if(str [i]==' ' || str [i]=='\n' || str [i]=='\t')
{
fjale++;
}
i++;
}
printf(“Numri total i fjaleve= %d\n", fjale);

return 0;
}
47
FUND LEKSIONI 7

You might also like