Sunteți pe pagina 1din 7

Siruri de caractere Un tablou este o colecie de variabilede acelai tip, apelate cu acelai nume.

Tablourile sunt plasate ntr-o zon de memorie contigu. Accesul la un element altabloului se face cu ajutorul unor indici. Un ir de caractere este un tablou unidimensional cu elemente de tip caracter. Forma general de declarare a unui ir de caractere este este urmtoarea: char nume _ ir [numr_elemente]; O constanta de tip sir de caractere de declara intre doua caractere . In memoria interna, o constanta de acest tip este retinuta sub forma unui vector de caractere. Fiecare componenta a sirului (incepand cu cea de indice 0) retine codul ASCII al caracterului pe care il memoreaza. Conventia este ca ultimul octet sa retina 0 (codul caracterului nul). Caracterul nul este memorat automat. Trebuie rezervate lungimea_sirului+1 caractere char (+1 pentru caracterul nul). Limbajul C/C++ permite initializarea unui tablou de caractere printr-o constanta sir, care include automat caracterul null. Exemplu : char vect[11]=calculator; char vect[]=calculator; (compilatorul face calculul numarului de octeti necesari) char vect[100]=calculator; (s-au rezervat mai multi octeti decat era necesar) Sirurile de caractere sunt de fapt tablouri de caractere, care au ca ultim element un terminator de sir, caracterul null. Exemplu: char tc[5] = {a, b, c, d, e}; // tablou de caractere char sc[5] = {a, b, c, d, \0}; // sir de caractere cu elementele abcd Ultima initializare este echivalenta cu: char sc[5] = abcd; //sau char sc[] = abcd; char sc1[5] = abcd; char s[10]; cout<<sc<<endln; //afiseaza abcd cout<<tc<<endl; //eroare: tabloul de caractere nu contine terminatorul de sir, deci nu poate fi afisat ca sir cout<<s<<endl; // eroare: tablou neinitializat cout<<sc1[0]; // afiseaza primul caracter din sirul sc1 cout<<sc1[2]; // afiseaza al treilea element din sirul sc1 sc1[1]=K; // elementului din sir de indice 1 i se atribuie valoarea K; CITIREA / AFISAREA SIRURILOR DE CARACTERE Sirurile de caractere pot fi initializate inca de la declarare sau citite pe parcursul programului. a. Citirea unui sir de caractere se poate face ca citirea oricarui tablou, intr-un for, caracter cu caracter (desi nu este recomandata). In acest caz, terminatorul de sir nu este memorat automat, el trebuie pus explicit dupa ultimul caracter din sir.

Exemplu: char c[20]; for(int i=0;i<=5;i++) cin>>c[i]; cout<<c<<endl; //se va afisa sirul format din cele 6 caractere, urmat de caractere reziduale, //initializate implicit la compilare, din cauza ca n-a fost pus terminatorul de sir c[6]=0; cout<<c<<endl; //a fost pus terminatorul de sir, deci sirul va fi afisat corect b. Se poate face pur si simplu, folosind cin>>. Caracterul nul este adaugat automat. Dezavantajul este ca in acest fel nu se pot citi siruri care contin mai multe cuvinte separate prin spatii. Citirea sirului se sfarseste la intalnirea primului caracter blank (de ex, daca se citeste ora de informatica, variabila c va retine numai ora). Exemplu char c[30]; cin>>c; cout<<c; c. Se poate folosi o functie speciala pentru citirea sirurilor de caractere, inclusa in biblioteca string.h (varianta recomandata). Exemplu char a[30],x;int nr; cin.get(a,nr,x); Functia cin.get citeste un sir de caractere sau pana cand au fost citite nr-1 caractere, sau daca s-a intalnit caracterul x. Al treilea parametru poate lipsi, caz in care el este implicit caracterul \n (new line). Sunt citite si caracterele albe, caracterul nul este inserat automat iar caracterul transmis ca ultim parametru nu este inserat in sir. Exemplu char a[30]; cin.get(a,5,s); //daca se citeste sirul maimuta, variabila a va retine maim cin.get(a,15,s); //daca se citeste sirul maimuta, variabila a va retine maimuta cin.get(a,15,t); //daca se citeste sirul maimuta, variabila a va retine maimu cin.get(a,4,t); //daca se citeste sirul maimuta, variabila a va retine mai cin.get(a,10); //daca se citeste sirul maimuta, variabila a va retine maimuta Functia cin.get( ) fara parametri are rolul de a citi un caracter (alb sau nu). Functia cin.get(char c) are rolul de a citi un caracter (alb sau nu) pe care il incarca in variabila c. Observatie: In cazul utilizarii repetate a functiei cin.get(a,nr,x), dupa fiecare folosire trebuie citit caracterul de la sfarsitul fiecarui sir , adica \n (in caz contrar, acest caracter va fi incarcat la inceputul urmatorului sir, a carui citire se termina la caracterul Enter, deci citirea celui de-al doilea sir se termina inainte de a incepe, iar al doilea sir va fi sirul vid). Aceasta citire a caracterului \n se realizeaza folosind cin.get() fara parametri. Exemplu char a[30],b[30]; cin.get(a,15); cin.get(b,10); 2

Daca se incearca citirea sirurilor sarbatoare si vacanta, se observa ca a=sarbatoare, b= (nici nu apucam sa citim sirul b). Varianta corecta este: cin.get(a,15); cin.get(); cin.get(b,10); Afisarea unui sir de caractere se face folosind cout. cout<<a; Se poate afisa si caracter cu caracter, ca in cazul tablourilor, dar aceasta varianta nu este recomandata. Funcii care lucreaz cu iruri de caractere 1. Incluse in biblioteca <string> unsigned int strlen(char *sir); Efect: returneaz numrul de caractere al unui ir de caractere, fr a lua n considerare caracterul nul de la sfritul irului Exemplu: char a[100]=mama; cout<<sirul are <<strlen(a)<< caractere; //va afisa 4 char *strcpy(char *dest,char *sursa); Efect: copiaz irul de la adresa sursa la adresa destinaie. Copierea se termin la ntlnirea caracterului nul. Funcia returneaz adresa irului destinaie. Simuleaz operaia de atribuire a=b. Exemplu: char a[100]=crocodil,b[100]=hipopotam; strcpy(a,b); cout<<sirul a: <<a<<endl; //hipopotam cout<<sirul b: <<b<<endl; //hipopotam char *strncpy(char *dest,char *sursa,unsigned int n); Efect: copiaz primii n octei din irul de la adresa surs la adresa destinaie, fr a aduga caracterul nul. Funcia returneaz adresa irului destinaie. Sirul surs rmne nemodificat. Exemplu: char a[100]=crocodil,b[100]=hipopotam; strncpy(a,b,4); cout<<sirul a: <<a<<endl; //hipo cout<<sirul b: <<b<<endl; //hipopotam char *strcat(char *dest,char *sursa); Efect: adaug irului de la adresa destinaie, naintea caracterului nul irul de la adresa surs. irul de la adresa surs rmne nemodificat. Operaia se numete concatenare. La adresa destinaie vom avea irul destinaie urmat de irul surs. irul destinaie are lungimea egal cu suma lungimilor irurilor. Exemplu: char a[100]=mama,b[100]=merge; strcat(a,b); cout<<sirul a: <<a<<endl; //mamamerge cout<<sirul b: <<b<<endl; //merge 3

char *strncat(char *dest,char *sursa, unsigned int n); Efect: adaug irului de la adresa destinaie, naintea caracterului nul primii n octei ai irul de la adresa surs. irul de la adresa surs rmne nemodificat. Funcia returneaz adresa de nceput a irului destinaie. Exemplu: char a[100]=mama ,b[100]=merge; strncat(a,b,3); cout<<sirul a: <<a<<endl; //mama mer cout<<sirul b: <<b<<endl; //merge char *strchr(char *sir,int car); Efect: caut de la stnga la dreapta, caracterul car n irul de caractere sir. Dac este gsit, funcia ntoarce adresa subirului care ncepe cu prima apariie a caracterului citit i se termin cu carcterul nul. Dac nu este gsit intoarce o expresie de tip char* cu valoarea 0. Exemplu: char a[100]=crocodil; cout<<strchr(a,o); //ocodil char *strrchr(char *sir,int car); Efect: caut de la dreapta la stnga, caracterul car n irul de caractere sir. Dac este gsit, funcia ntoarce adresa subirului care ncepe cu ultima apariie a caracterului citit i se termin cu carcterul nul. Dac nu este gsit intoarce o expresie de tip char* cu valoarea 0. Exemplu: char a[100]=crocodil; cout<<strrchr(a,o); //odil char *strstr(char *sir1,char *sir2); Efect: identific dac irul sir2 este subir(caractere succesive) al irului sir1. dac este gsit, funcia returneaz adresa sa de nceput n cadrul irului s1, altfel returneaz 0. Cutarea se face de la stnga la dreapta. Dac sir2 apare de mai multe ori, returneaz adresa primei sale apariii. Exemplu: char a[100]=azi ele fac cafele,b[20]= ele; cout<<strstr(a,b); //ele fac cafele char *strtok(char *sir1,char *sir2); Efect: separ irul sir1 n entiti delimitate de unul sau mai multe carctere din irul sir2 (acestea avnd rol de separatori). Apelul funciei se face prima dat sub forma strtok(sir1,sir2) - funcia ntoarce adresa primului caracter al primei entiti - i a doua oar sub forma strtok(NULL,sir2) i funcia ntoarce adresa primului caracter al urmtoarei entiti i dup el este adugat caracterul nul. Cnd irul iniial nu mai conine entiti, intoarce adresa nul. Exemplu: char a[100],sep[]=, ;.?!,*p; cin.get(a,100); p=strtok(a,sep); while (p) { cout<<p<<endl; p=strtok(NULL,sep); int strcmp(char *sir1,char *sir2); Efect: compar cele dou iruri de caractere. Valoarea returnat este: <0 dac sir1<sir2 4

=0 dac sir1=sir2 >0 dac sir1>sir2 Funcia face distincie ntre literele mari si literele mici. Compararea irurilor se realizeaz comparnd de la stnga la dreapta caracter cu caracter. Un ir este mai mic dact altul dac figureaz n dicionar inaintea lui. Exemplu: char a[20]=adriana,b[20]= ana, c[20]= Ana; cout<<strcmp(a,b); //<0 deoarece a=a si d<n => adriana< ana cout<<strcmp(a,c); //>0 deoarece a>A cout<<strcmp(b,c); //>0 deoarece a>A int stricmp(char *sir1,char *sir2); Efect: are acelai efect ca i strcmp dar nu face diferen ntre literele mari i literele mici. Exemplu: char b[20]= ana, c[20]= Ana; cout<<stricmp(b,c); //==0 int strncmp(char *sir1,char *sir2,int n); Efect: are acelai efect ca i strcmp dar compara doar primele n caractere din cele doua siruri Exemplu: char b[20]= adriana, c[20]= adina; cout<<strncmp(b,c,2); //==0 int strncmpi(char *sir1,char *sir2,int n); Efect: are acelai efect ca i strncmp dar nu face diferen ntre literele mari i literele mici. Exemplu: char b[20]= adriana, c[20]= ADina; cout<<strncmpi(b,c,2); //==0 char *strupr(char *s) Efect: transform un ir de caractere din litere mici n litere mari. Restul caracterelor rmn nemodificate. Exemplu: char a[100]=1 crocodil; cout<<strupr(a); //1 CROCODIL char *strlwr(char *s) Efect: transform un ir de caractere din litere mari n litere mici. Restul caracterelor rmn nemodificate. Exemplu: char a[100]=1 CROCODIL; cout<<strupr(a); //1 crocodil

2. Incluse in biblioteca <stdlib.h> int atoi(char *s) Efect: transform un ir de carcatere ntr-un ntreg (int). Exemplu: int n; char *s=1234.56; n=atoi(s); cout<<n; // va afisa 1234 long atol(char *s) Efect: transform un ir de carcatere ntr-un ntreg (long). double atof(char *s) Efect: transform un ir de carcatere ntr-un numr real. Exemplu: float n; char *s=-4521234.56; n=atof(s); cout<<n; // va afisa -4521234.56 char *itoa(int val, char *sir, int baza) Efect: transform un numar ntreg (int) ntr-un ir de caractere. Baza reprezint baza in care este scris noul numr. Exemplu: int n=12345; char s[20]; itoa(n,s,10); cout<<s // va afisa sirul 12345 char *ltoa(long val, char *sir, int baza) Efect: transform un numar ntreg (long) ntr-un ir de caractere. char *ultoa(unsigned long val, char *sir, int baza) Efect: transform un numar ntreg (unsigned long) ntr-un ir de caractere.

3. Funcii care lucreaz cu caractere Sunt incluse in biblioteca <ctype.h>. Testeaz dac un cracter primit ca parametru ndeplinete o condiie. Returneaz 0 dac acel caracter nu indeplinete condiia i valoare diferit de 0 dac o ndeplinete. int isalnum(int c); Efect:testeaz dac un caracter este liter sau cifr Exemplu: char s=y; cout<<isalnum(s); // va afisa o valore diferita de 0 int isalpha(int c); Efect: testeaz dac un caracter este liter int isdigit(int c); Efect: testeaz dac un caracter este cifr Exemplu: char s=y; cout<<isdigit(s); // va afisa 0 int islower(int c); Efect: testeaz dac un caracter este liter mic int isupper(int c); Efect: testeaz dac un caracter este liter mare int isspace(int c); Efect: testeaz dac un caracter este spaiu int isxdigit(int c); Efect: testeaz dac un caracter este cifr n baza 16 Exemplu: char s=d; cout<<isxdigit(s); // va afisa o valore diferita de 0, deoarece d este o cifra in baza 16 int toupper(int c); Efect: transform un caracter care este litera mic n liter mare Exemplu: char s=y; cout<<toupper(s); // va afisa Y int tolower(int c); Efect: transform un caracter care este litera mare n liter mic Exemplu: char s=Y; cout<<tolower(s); // va afisa y

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