UNIX,Linux,Retele,Programare
Homespacer Tutorialespacer Forumspacer Utilizatorispacer Cautarespacer Webmailspacer Director web


Lectia 05 - Lucrul cu siruri de caractere

Scris de tercot

Ok…siruri in c…ce frumos suna!OK…sa ne intoarcem pentru un moment in lumea reala…sirurile de caractere(textele de cuvinte) din lumea reala sunt formate, asa cum le spune si numele,din caractere.Practic un text este format din mai multe caractere puse una langa alta.Asa este si in lumea de C - > un text este alcatuit din-trun sir de caractere(array de caractere).Daca va mai aduceti amine,o variabila de tipa ‘caracter’ se declara in felul urmator:

char <nume_variabila> ;

Asa cum am spus mai sus,pentru un text avem nevoie de un sir(array) de variabile de tip ‘char’.Arrayul de caractere il declaram asa:

char <nume_variabila>[dimensiune_sir];

exemplu:

char nume[20];

In exemplul de mai sus,programul creeaza si rezerva o zona de memorie de 20 de octeti.Umplerea acelei zone de memorie cu ceva text se realizeaza cu ajutoru functiei
cin aceeasi functie care o folositi si pentru a citi alte tipuri de date.

Reprezentarea in memorie

Ok acum ca am vazut ca avem nevoie de array de char-uri pentru a inmagazina un text. Haideti sa vedem cum apare in memorie un text.
Pentru a face acest pas trebuie sa stim sau sa ne reamintim,ce reprezinta defapt un array.Un array reprezinta o colectie de variabile declarate deodata pentru a face economie de spatiu la programare.Sa luam un exemplu normal.Sa zicem ca avem nevoie de 30 medii de la 30 indivizi.Daca am declara cele 30 medii in mod separat,am proceda cam asa:

int media1,media2,media3…media30;

Ei bine,array-ul ne permite ca sa scurtam dramatic marimea codului ‘compresand’ cele 30 de variabile declarate cu una singura!
Arrayul respectiv va arata asa:

int medii[30];

Accesarea unei variabile din acest array se face asa:

medii[int index_medie];

Sa zicem ca am dori sa stim media ce are index 13.In cazul acesta,am proceda astfel:

medii[12];

Se observa ca,pentru a afla a 13-a medie se insereaza la index …numarul 12.De ce?probabil va intrebati.Ei bine…indexul unui array incepe de la 0 si nu de la 1 cum ar fi normal.Din acest motiv…apelare de

medii[30];

ar da o eroare deoarece al 30-lea element are defapt index 29.
Cam atat despre arrayuri…acum…cand declaram un array,numele arrayului reprezinta, defapt un pointer de memorie care indica locatia primului element din array.
Sa zicem ca am declarat un array de caractere(un text) astfel:

char nume[30];

sa zicem ca am introduce in ‘nume’ “Popescu Ion”.In memorie ar fi reprezentat cam asa:

Popescu Ion� <spatiile libere reprezinta cei 18 de octeti nefolositi!

Se observa prezenta lui .Acest informeaza calculatorul ca sirul introdus se termina.Practic cand ii cerem calculatorului sa afiseze sirul introdus in arrayul
‘nume’…el va afisa litera cu litera pana va da de caz in care se va opri!
Acum ca stim aceste informatii … hai sa vedem care este diferenta dintre ‘V’ si “V”.
‘V’ este reprezentat in memorie ca si : V
“V” este reprezentat in memorie ca si : V�
Ati priceput?Nu este asa de greu cu decalratia si citirea!

Afisarea unui text tinut intr-un array de char-uri

Se face simplu cu functia cout.Pentru a afisa continutul array-ului declarat mai sus vom folosi simplu:

cout<<nume;

Operatii ce se pot realiza in siruri si intre siruri!

Functiile se vor aplica pe array-ul nume declarat mai sus in care,sa presupunem ca exista un text :”Popescu Ion”!

Toate functiile ce vor urma sunt prezente in headerul string.h si trebuie inclus in proiect ca sa se poata folosi!
Operatiile ce le voi prezenta in continuarea sunt:

� Determinarea lungimii unui sir!
� Copierea unui sir de caractere in alt sir de caractere!
� Concatenarea a 2 siruri(Unirea a 2 siruri)!
� Verificare daca 2 siruri sunt identice!
� Convertirea unui sir de caractere in majuscule si minuscule!
� Numarul de aparitii a unui caracter intr-un sir!
� Inversarea unui sir de caractere!
� Convertirea din sir in numar!

Determinarea lungimii unui sir!
Se realizeaza cu functia strlen care este declarata in header astfel:

int strlen(const char *array_de_caractere);

In exemplul nostru ar arata cam asa:

strlen(nume);

strlen returneaza un int ce reprezinta lungimea sirului prezent in variabila array_de_caractere.In cazul nostru ea va returna lungimea sirului “Popescu Ion” care este
de 11!

Copierea unui sir de caractere in alt sir de caractere!

O realizam folosind functia strcpy declarata,in header astfel:

char *strcpy(char *destinatie_sir,const char *sursa_sir);

Cum pentru a aplica functia ca exemplu ne trebuie 2 siruri,iar noi avem doar un sir(sirul nume) va trebui sa mai creem un sir…sa zicem ca creem si

char adresa[50];

Sa zicem ca dorim sa copiem ce este in nume in sirul adresa.Astfel,aplicand functia pe cele 2 siruri astfel:

strcpy(adresa,nume);

strcpy returneaza un pointer ce reprezinta inceputul sirului destinatie_sir.
Important! -> Copierea unui sir pe alt sir va duce la distrugerea continutului sirului destinatie_sir!

Concatenarea a 2 siruri(Unirea a 2 siruri)!

Se realizeaza cu ajutoru functiei strcat care are urmatorul prototip:

char *strcat(char *destinatie_sir,const char *sursa_sir);

Noi avem deja declarate 2 siruri(nume si adresa) dar adresa este gol deocamdata asa ca o unire a celor 2 siruri va returna,normal,continutul sirului nume!
Sa inmagazinam in adresa sirul : “Preotesei Nr.2″!
Acum putem realiza unirea propriu-zisa:

strcat(nume,adresa);

Dupa executarea functiei,nume va contine :”Popescu IonPreotesei Nr.2″!
strcat returneaza un pointer la sirul destinatie_sir!

Verificare daca 2 siruri sunt identice!
O realizam cu ajutorul functiei streql care are urmatoarea declaratie:

int streql(char *sir_1,char *sir_2);

Exemplu:

streql(nume,adresa);

streql va returna 1 daca sirurile sunt identice si 0 daca cele 2 siruri difera!
Important! -> Functia este case sensitive(literele mari le vede diferit fata de cele mici) pentru a testa 2 siruri pentru identitate fara a tine cont de marimea literelor vom
-> folosi functia strieql care are acelasi prototip si nu are rost sa mai dau exemplu de folosire smile

Convertirea unui sir de caractere in majuscule si minuscule!
O facem cu ajutorul functiilor strlwr pentru minuscule si strupr in majuscule!
Antetul functiilor este:

char *strlwr(char *sir);
char *strupr(char *sir);

Sa aplicam strupr pe variabila nume de exemplu:

strupr(nume);

Practic dupa apelarea functiei,nume va contine: “POPESCU ION”(toate caracterele alfanumerice)!
Functiile returneaza un pointer la sirurile pasate ca argumente la apelare!
strlwr este asemanatoarea si nu voi mai da exemplu!

Numarul de aparitii a unui caracter intr-un sir!
Se realizeaza cu functia charcnt ce are prototipul:

int charcnt(char *sir,int litera);

Exemplu,sa presupunem ca dorim sa cautam numarul de aparitii a caracterului ‘o’ in sirul nume!

charcnt(nume,(int)’o');

Am folosit un cast (int) deoarece,al doilea argument la apelarea de functie este int litera care trebuie sa fie int!
In exemplul nostru,functia va returna 29de atatea ori apare caracterul ‘o’ in “Popescu Ion”)

Inversarea unui sir de caractere!

Se realizeaza cu ajutorul functiei strrev care are prototipul:

char *strrev(char *sir_de_inversat);

Daca apelam functia pentru sirul nume o realizam astfel:

strrev(nume);

Dupa apelarea de functie,sirul nume va contine :”noI ucsepoP”!
strrev returneaza pointer la sirul inversat!

Convertirea din sir in numar!
Pentru a converti un sir de caractere intr-un numar cu care programul poate lucra se pot folosi o serie de functii:

atoi(”sir_de_caractere”) ex: atoi(”145″); ->> converteste un sir de caractere intr-o valoare intreaga
atof(”sir_de_caractere”) ex: atof(”145.90″); ->> converteste un sir de caractere intr-o virgula mobila
atol(”sir_de_caractere”) ex: atol(”1459802″);->> converteste un sir de caractere intr-un long

Pentru critici si comentarii postati aici!
© 3Nigma

Categoria: Programare

 
© 2008 SkullBox, all rights reserved