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 memorieOk 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\0 <spatiile libere reprezinta cei 18 de octeti nefolositi!
\0 = NULL ( caracterul cu codul ASCII 0 )
Se observa prezenta lui
\0.Acest
\0 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
\0 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\0Ati priceput?Nu este asa de greu cu decalratia si citirea!
Afisarea unui text tinut intr-un array de char-uriSe 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 [/b]strcpy[/b] 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
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