Sunteți pe pagina 1din 16

SIRURI(VECTORI)

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];

char s2[10]="sirul 2";

char s3[]="sirul 3";

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:

s4 =s-au alocat 0 octeţi = eroare de compilare

s5 =s-au alocat 5 octeţi şi s-au iniţializat primele 6 poziţii = eroare de


compilare

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.

1.2. Vizualizarea unui şir de caractere (modul de


memorare)
Fie urmatoarea declatie

char s[15]=”LIMBAJUL C++”;

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

Explicaţii: Pentru memorarea unui şir de caractere, compilatorul reţine


doar adresa primului caracter din şir. Celelalte caractere vor fi memorate
folosind octeţii următori.

Compilatorul indică sfârşitul şirului de caractere plasând un caracter ’\0’


(caracterul cu codul ASCII 0) după ultimul caracter din şir. Astfel, un şir de
caractere este identificat de compilator prin adresa de început (adresa
primului caracter din şir) şi primul caracter ’ \0’ găsit printre octeţii
următori primului caracter.

Exemplu:

char s1[11]="Informatica";

char s2[100]="sir de lungime maxima 99";

cout <<"s1: "<< s1 << endl;


s2[5]=’\0’;

cout <<"s2: "<< s2 << endl;

Se va afişa:

s1: Informaticasir de lungime maxima 99

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:

Caracterul ‘a’ se memorează pe 1 octet, pe când şirul de caractere “a” se


memorează pe doi octeţi:
a
Caracterul ‘a’
a
\0
Şirul de caractere “a”

1.3. Afişarea vectorilor de caractere.


Afisarea unui vector de caractere se poate realiza in doua feluri si anume:
 ca o variabila neindexata, precizând doar numele sirului în cadrul
instructiunii cout
 sau la fel ca afisarea oricarui vector, element cu element, începand
cu elementul aflat pe prima pozitie (pozitia 0) pana la marcatorul de
sfârșit de sir('\0').

Exemplu:

int main ()

char s[20]="Lectii de informatica";

// varianta 1

cout <<s;

// varianta 2

for (int i=0; s[i]; i++)

cout <<s[i];

return 0;

1.4. Citirea vectorilor de caractere.


Citirea elementelor unui vector se poate realiza în trei moduri diferite:
 ca o variabilă neindexată, precizând numele șirului în cadrul
instrucțiunii cin
 folosind comanda cin.get()
 sau la fel ca citirea oricarui vector, element cu element, începand cu
elementul aflat pe prima pozitie (pozitia 0) pana la marcatorul de
sfârșit de sir('\0').
 Exemplu:
char c, s[150];

int main (void)

// 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;

Declarare : forma generală:

tip_asociat * variabilă_pointer;

Exemplu: int * p; //pastreaza adresa unui intreg

Legarea unui pointer la o variabilă (obţinerea adresei


unei variabile)
Forma generală :

tip_asociat * variabilă_pointer;

tip_asociat variabila_tip_asociat;

variabila_pointer = & variabila_tip_asociat;


Exemplu:

int * p; //pointer catre un intreg-contine adresa unui intreg

int x = 2; //variabila x este variabila statica de tip int cu valoarea 2

p = &x; //p primeste ca valoare adresa variabilei x prin intermediul


operatorului &

cout<<"adresa variabilei x este p="<<p<<endl;

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)

Vizualizare in figura urmatoare.

Dereferenţierea (adresarea indirectă)


Adresarea indirecta are urmatoarea forma generala:

* variabilă_pointer = expresie_tip_asociat;

Exemplu:

int x, *p;

int main ()

{ x = 2 ; //variabila x primeste valoarea 2

p = & x ; //variabila p primeste valoarea adresei lui x

*p = 4; //valoarea indicata de pointerul p(valoarea de la adresa lui x) ia

//valoarea 4.Se modifica continutul variabilei x prin intermediul

// pointerului *p
cout << x; //afiseaza valoarea 4

return 0;

Atribuirea între doi pointeri de acelaşi tip


Atribuirea între doi pointeri de același tip se realizează respectând
următoarea formă generală:

tip_asociat * v1, v2;

v1 = v2;

Exemplu:

int main ()

int x = 2, *p, *q ;

// definim o variabila intreaga x cu valoarea 2 si doi pointeri catre int notati


*p si *q

p = & x ; // variabila p primeste ca valoarea adresa variabilei x

q = p; // variabila q primeste valoarea variabilei p

cout<<*q; //afisaza 2, valoarea memorata la adresa x, adresa pastrata in p


si q

return 0;

Observaţie:

În instrucţiunea p = &x; variabilei de tip pointer p i se atribuie o valoare


constantă de tip pointer. (adresa variabilei x, această adresă nu poate fi
modificată). Astfel o instrucţiune de forma &x = p; este greşită (se atribuie
unei constante o variabilă). În instrucţiunea p = q; variabilei de tip pointer
p i se atribuie o variabilă de tip pointer. Astfel o instrucţiune de forma q =
p; este corectă.

Pointer la caracter (char *)


Aşa cum putem declara variabile de tipul int*, la fel se pot defini variabile
de tip char*. În acest caz, o variabilă de tip char* (pointer la caracter) va
memora o adresă a unei variabile de tip char.

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

char S[200]="ABCDEF"; //sirul "ABCDEF" este memorat in S

char * p; //pointer la caracter

p=S; //p primeste adresa de inceput a sirului S: ABCDEF

cout << p<<endl; //afiseaza sirul care incepe la adresa p:ABCDEF

p++; //adresa caracterului 'B'

cout << p<<endl; //afiseaza sirul care incepe la adresa p:BCDEF

*p = 'Z'; //schimba caracterul 'B' cu 'Z'

cout << p<<endl; //afiseaza sirul care incepe la adresa p:ZCDEF


//S = p; atribuire gresita!

p = S + 3; //adresa p creste cu 3, salt cu 3 octeti:

cout << p<<endl; //afiseaza sirul care incepe la adresa p:DEF

cout << S<<endl; //p primeste adresa de inceput a sirului S: AZCDEF

return 0;

FUNCTII
PREDEFINITE
 Lungimea unui sir de caractere: STRLEN

int strlen (char *s)

Returnează numărul de caractere a şirului care începe la adresa s (primită


ca parametru), fără a număra caracterul ‘\0’.
 Copierea unui sir de caractere: STRCPY, STRNCPY

char * strcpy (char *d, char *s)

char * strncpy (char *d, char *s, unsigned n)

Funcţia strcpy copie peste şirul d, şirul s. Copierea se va încheia după


copierea caracterului ‘\0’ din şirul s. Funcţia returnează adresa d.

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

char * strcat (char *d, char *s)

char * strncat (char *d, char *s, unsigned n)

Funcţia strcat concatenează la şirul d o copie a şirului s, după care adaugă


‘\0’. Funcţia returnează adresa d.
Funcţia strncat concatenează n caractere din şirul s la şirul d. În cazul în
care numărul de caractere a şirului s este mai mic decât n, se vor
concatena doar strlen (s) caractere şi caracterul ‘\0’ a şirului s. Funcţia
returnează adresa d.
 Compararea sirurilor de caractere: STRCMP

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

int * stricmp (char *s1, char *s2)

int * strncmp (char *s1, char *s2, unsigned n)

int * strnicmp (char *s1, char *s2, unsigned n)

Funcţia strcmp compară lexicografic şirurile s1 şi s2. Rezultatul funcţiei va


fi:

- un întreg < 0 dacă s1<s2,

- un întreg >0 dacă s1>s2,

- 0 dacă s1 şi s2 sunt identice.

Funcţia stricmp este asemănătoare cu strcmp, diferenţa constă în faptul


că nu se face diferenţa dintre litere mici şi litere mari.

Funcţia strncmp este asemănătoare cu strcmp, diferenţa constă în faptul


că se vor compara doar primele n caractere ale şirurilor s1 şi s2.

Funcţia strnicmp este asemănătoare cu strncmp, diferenţa constă în


faptul că nu se face diferenţa dintre litere mici şi litere mari.
 Inversarea sirurilor de caractere: STRREV

char * strrev (char *s)

Funcţia strrev inversează şirul s şi returnează adresa şirul inversat.


 Duplicarea unui sir de caractere

char * strdup (char *s)

Funcţia strdup caută o locaţie de memorie unde poate să memoreze un


duplicat al lui s. În caz de succes se va returna adresa găsită. Altfel se
returnează NULL
 Căutarea unui caracter într-un şir: STRCHR, STRRCHR
char * strchr (char *s, char c)

char * strrchr (char *s, char c)

Funcţia strchr caută caracterul c în şirul s. Căutarea se face de la stânga la


dreapta. În cazul în care caracterul c este găsit, căutarea se încheie şi
funcţia returnează adresa din şirul s unde a fost găsit c. În cazul în care
caracterul c nu este găsit, funcţia returnează adresa 0 (NULL).

Funcţia strrchr se deosebeşte de strchr prin faptul că va căuta caracterul


c de la dreapta la stânga.
 Cautarea unui subsir intr-un sir: STRSTR

char * strstr (char *s1, char *s2)

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

char * strupr (char *s)

char * strlwr (char *s)

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

char * strset (char *s, char c)

char * strnset (char *s, char c, unsigned n)

Funcţia strset înlocuieşte toate caracterele din şirul s cu caracterul c.


Returnează un pointer la s.

Funcţia strnset înlocuieşte primele n caractere din şirul s cu caracterul c.


Returnează un pointer la s.
 Despartirea unui sir in subsiruri: STRTOK

char * strtok (char *s, char *d)


Funcţia strtok este utilizată pentru a delimita unul sau mai multe subşiruri
din şirul s, în funcţie de anumite caractere separator, memorate în şirul d.

Primul apel al funcţiei strtok:

· 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.

· plasează în şirul s un caracter ‘\0’ imediat după ultimul caracter al


subşirului găsit.

· în cazul în care nu poate fi delimitat un subşir cu proprietatea cerută,


funcţia returnează NULL.

Următoarele apeluri ale funcţii strtok utilizând NULL ca prim parametru

- continuă delimitarea unui subşir, căutând de la adresa imediat


următoare caracterului “\0” plasat de apelul precedent.

- funcţia returnează un pointer către adresa subşirului astfel delimitat sau


NULL dacă nu mai există subşiruri.

- După fiecare subşir delimitat, funcţia plasează “\0”.

Forma generala de separare a unui şir s în subşiruri, în funcţie de anumite


caractere separator memorate în şirul d:

# include <string>

using namespace std;

int main ()

char s[200]; // şirul care va fi despărţit

char d[]=",. "; // şirul care conţine separatorii

char *p; // pointer căruia i se va atribui adresa subşirurilor găsite

cin.get (s, 200);

p= strtok (s,d); // primul apel

while (p)
{

cout << endl << p; // prelucrarea subşirurilor găsite

p=strtok (NULL, d); // apelurile 2, 3, …

return 0;

}
 strspn şi strcspn

int strspn (char *s, char *d)

int strcspn (char *s, char *d)

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

int * atoi (char *s)

long * atol (char *s)

float * atof (char *s)

char * itoa (int nr, char *s, int baza)

char * ltoa (long nr, char *s, int baza)

atoi converteşte şirul s în int şi returnează numărul rezultat. Conversia se


opreşte la întâlnirea primului caracter nenumeric. În cazul în care şirul nu
începe cu caractere numerice se va returna 0.

atol converteşte şirul s în long şi returnează numărul rezultat. Conversia


se opreşte la întâlnirea primului caracter nenumeric. În cazul în care şirul
nu începe cu caractere numerice se va returna 0.

atof converteşte şirul s în float şi returnează numărul rezultat. Conversia


se opreşte la întâlnirea primului caracter care nu este număr şi diferit de
„.”. În cazul în care şirul nu începe cu caractere numerice sau cu „.”se va
returna 0.
itoa converteşte int – ul nr în şir şi îl memorează în s. Pentru conversie se
va utiliza baza specificată de cel de-al 3-lea parametru. Funcţia returnează
adresa şirului s.

ltoa converteşte long – ul nr în şir şi îl memorează în s. Pentru conversie se


va utiliza baza specificată de cel de-al 3-lea parametru. Funcţia returnează
adresa şirului s.

S-ar putea să vă placă și