Documente Academic
Documente Profesional
Documente Cultură
DE CARACTERE
1.1. Declararea sirurilor de caractere
Forma generala de declarare a unui sir de caractere:
char nume_sir[dimendiune];
Exemplu:
char s1[10];
unde:
s1 = vector de caractere care poate conţine maxim 9 caractere (s-au
alocat 10 octeţi).
s2 = vector de caractere care poate conţine maxim 9 caractere şi
care conţine 7 caractere (s-au alocat 10 octeţi).
s3 = vector de caractere care poate conţine maxim 7 caractere şi car
conţine 7 caractere (s-au alocat 8 octeţi).
Greşeli:
char s4[];
char s5[5]="abcdef";
unde:
Atenţie !!
Dacă instrucţiunile programului adaugă caractere unui şir de caractere,
depăşind astfel spaţiul alocat, operaţiile se vor efectua eronat. Este posibil
să se modifice astfel alte variabile. Se recomandă alocarea unui spaţiu
suficient de mare pentru evitarea unui astfel de caz.
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
unde:
s-au alocat 15 octeţi
s-a memorat şirul de lungime 12
după ultimul caracter din şir a fost adăugat automat caracterul NULL
(’\0’ adică caracterul cu codul ASCII 0) indicând astfel sfârşitul şirului.
au rămas liberi 2 octeţi
Exemplu:
char s1[11]="Informatica";
Se va afişa:
s2: sir d
Explicaţii:
Şirul s1 conţine 11 caractere. Pentru acest şir s-au alocat 11 octeţi.
Dintre cei 11 octeţi alocaţi, unul ar fi trebuit să fie rezervat pentru
‘\0’. Iniţializând şirul cu 11 caractere, caracterul ‘\0’ nu a mai fost
plasat la sfârşitul şirului.
Şirul s2 conţine 25 de caractere. Pentru a-l memora, compilatorul i-a
alocat un spaţiu de 100 de octeţi începând (din întâmplare) de la
adresa imediat următoare sfârşitului lui s1.
Datorită faptului că la sfârşitul şirului s1 nu există ‘\0’, pentru a-l
afişa, compilatorul parcurge octeţii succesivi de memorie până la
găsirea unui alt ‘\0’. Acesta se va afla la sfârşitul lui s2.
Al cincilea caracter din s2 a fost înlocuit cu ‘\0’. Pentru a-l afişa pe s2,
compilatorul parcurge octeţii succesivi, începând cu adresa primului
caracter din s2, până la întâlnirea unui ‘\0’. Acest ‘\0’ va fi găsit pe
poziţia 5. Astfel compilatorul consideră că acolo se termină şirul s2.
Observaţie:
Exemplu:
int main ()
// varianta 1
cout <<s;
// varianta 2
cout <<s[i];
return 0;
// Varianta 1
cin >> s;
// Varianta 2
cin.get();
cin.get(s,100);
return 0;
Explicaţii:
Varianta 1: cin>> vector_de_caractere;
Se vor citi toate caracterele până la întâlnirea primului spaţiu. După
ultimul caracter se adaugă ‘\0’. Ex. Dacă se introduce de la tastatură
şirul: “informatica este”, după apăsarea tastei ENTER, şirul va conţine
“informatica”, lungimea acestui şir este 11 şi s[11] va fi egal cu ‘\0’.
Varianta 2: Şirul este citit cu ajutorul funcţiei cin.get() care are trei
parametri:
cin.get (vector_de_caractere, int nr, char c=‘\n’)
unde:
vector_de_caractere = vectorul în care vor fi memorate
caracterele citite;
nr = numărul maxim de caractere care se vor citi;
c = caracterul care determină oprirea citirii.
Observații:
- sunt citite şi caracterele albe (spaţiu, tab)
- caracterul trimis ca al treilea parametru nu se adaugă la şir;
- după ultimul caracter se adaugă automat ‘\0’
- ultimul parametru este opţional, în cazul în care lipseşte se
consideră că este ‘\n’
Modul de funcţionare a funcţiei: Se citesc caractere de la
tastatură până la apăsarea tastei ENTER.
Dacă numărul de caractere tastate este mai mic decât nr şi nu a fost
întâlnit caracterul c (implicit ‘\n’) atunci se vor memora toate
caracterele.
Dacă numărul de caractere tastate este mai mare decât nr şi nu a
fost întâlnit caracterul c printre primele nr-1 caractere, atunci se vor
memora primele nr-1 caractere din cele tastate.
Dacă printre primele nr-1 caractere tastate se găseşte caracterul c
atunci se vor memora doar caracterele introduse înaintea lui c.
Funcţia cin.get() utilizează o zonă intermediară de memorie
(buffer) astfel:
Se memorează în buffer caracterele care s-au tastat
până la apăsarea tastei ENTER.
Se analizează pe rând primele nr-1 caractere (dacă există
nr-1 caractere) din buffer testându-se dacă printre
aceste caractere se află caracterul c. Dacă se întâlneşte
caracterul c, atunci, toate caracterele tastate înaintea lui
c vor fi adaugate şirului şi vor fi eliminate din buffer
aceste caractere şi caracterul c din buffer.
Din acest motiv, folosirea repetată a funcţiei cin.get () poate
funcţiona eronat. Motivul este că, după executarea unei citiri,
este posibil ca bufferul să nu se golească complet.
Se va utiliza :
cin.get (s1, 100);
cin.get(); // se mai citeşte un caracter din buffer – cu scopul de
a elimina acest caracter cin.get(s2, 100);
TIPUL CHAR*
Tipul pointer – generalităţi
Având definit un tip de dată, se poate defini un nou tip de dată care va
reţine adrese ale variabilelor din tipul dat.
Exemplul 1: Având definit tipul int, se poate defini un nou tip care va
reţine adrese ale variabilelor de tip int. Noul tip definit se va numi int *. În
acest caz spunem că:
Tipul int * se numeşte tip pointer la int;
O variabilă de tip int * este de tip pointer la int şi va putea memora
adrese ale variabilelor de tip int;
Tipul int se numeşte tip asociat tipului pointer int;
tip_asociat * variabilă_pointer;
tip_asociat * variabilă_pointer;
tip_asociat variabila_tip_asociat;
Exemplu:
valoarea variabilei x este 2
adresa variabilei x este 0x24ff08
valoarea variabilei p va fi 0x24ff08,
adresa variabilei este 0x24fefc
valoarea poinetrului *p este 2(valoarea pastrata la adrsa 0x24ff08)
* variabilă_pointer = expresie_tip_asociat;
Exemplu:
int x, *p;
int main ()
// pointerului *p
cout << x; //afiseaza valoarea 4
return 0;
v1 = v2;
Exemplu:
int main ()
int x = 2, *p, *q ;
return 0;
Observaţie:
La fel ca pentru orice tip de dată, pentru tipul char * există variabile şi
constante. Caracterele care formează un vector de caractere se vor
memora la adrese de memorie succesive. Numele unui vector de caractere
S reprezintă adresa de început a şirului, adică adresa caracterului S[0].
Spaţiul de memorare pentru un vector de caractere se alocă în momentul
declarării vectorului. Locul memorării (alocării) nu poate fi modificat. Din
acest motiv, numele unui vector de caractere este o constantă de tip
char*.
Exemplu:
int main()
return 0;
FUNCTII
PREDEFINITE
Lungimea unui sir de caractere: STRLEN
Funcţia strncpy copie n caractere din şirul s peste şirul d. În cazul în care
numărul de caractere a şirului s este mai mic decât n, se va copia şi
caracterul ‘\0’ a şirului s. Funcţia returnează adresa d.
Concatenarea sirurilor de caractere: STRCAT, STRNCAT
Funcţia strstr caută prima apariţie a şirului s2 în şirul s1. Căutarea se face
de la stânga la dreapta. În cazul în care şirul s2 este găsit se va returna
adresa din s1 unde începe s2. Altfel se returnează NULL.
Transformarea literelor mari in litere mici si invers:
STRUPR, STRLWR
Funcţia strupr transformă literele mici din şirul s în litere mari. Funcţia
returnează un pointer la şirul s.
Funcţia strlwr transformă literele mari din şirul s în litere mici. Funcţia
returnează un pointer la şirul s.
Inlocuirea caracterelor unui sir: STRSET, STRNSET
· returnează un pointer către primul caracter din primul subşir al lui s care
este format doar din caractere consecutive ce nu aparţin lui d.
# include <string>
int main ()
while (p)
{
return 0;
}
strspn şi strcspn
Funcţia returnează adresa din s a primului caracter din s care aparţine lui
d sau NULL dacă nici un caracter din s nu aparţine lui d.
Functii de conversie a sirurilor: ATOI, ATOL, ATOF, ITOA,
LTOA