Limbajele de programare au de regula un tip de date special definit pentru stringuri. Un string memoreaza un text. Pentru tipul string se definesc sufieciente operatii de prelucrare. In C, un sir de caractere cu semn sau fara semn devine string cu ajutorul unei conventii. Printre caracterele lui, la un moment dat, trebuie sa se regaseasca un caracter, avand codul ASCII = 0. Consstanta char acestui caracter este '\0'. Textul retinut intr-un astfel de string C se incheie inaintea primei aparitii a unui caracter, avand codul ASCII = 0. Din cauza ca, in C exista constanta NULL (folosita pentru adresa vida) care are valoarea 0 si din constructia stringului C, se mai spune ca , un string C este un string NULL-terminat.
ex.
char s[100];
strcpy(s,"Un text.");
Functia strcpy
de mai sus copiaza textul "Un text." la adresa s
, dupa care adauga caracterul cu codul ASCII = 0
.
Obs.:
In C, o constanta de tip string este data intre ghilimele ""
.
Fiind un tip de date standard C, pentru stringul definit NULL-terminat exista definite o multime de functii de prelucrare. Functiile de prelucrare a stringurilor C au antetele in fisierul string.h
Obs: functiile de prelucare a functiilor C incep toate cu prefixul str
Functie | Descriere |
---|---|
strcpy(s1,s2) |
s2 este copiat in s1 , iar continutul lui s1 se pierde |
strcat(s1,s1) |
la sfarsitul s1 se lipseste s2 |
strstr(s1,s2) |
s2 este cautat in s1 ; daca s2 nu se afla in s1 functia returneaza NULL , altfel returneaza adresa de memorie a primei aparitii a lui s2 in s1 |
ex.
char* s="Acesta este un text.";
char* p=strstr(s,"est");
Obs.
Pentru a afla pozitia primei aparitii a stringului s
, din exemplul de mai sus, relativa la inceputul stringului,
evaluam expresia p-s
int pos=p-s; //2
Functie | Descriere |
---|---|
strchr(s,c) |
cauta prima aparitie a caracterului c in s ; daca este gasit returneaza adresa de memorie unde se afla prima data |
strlen(s) |
returneaza lungimea stringului: se innumara cate caractere se afla la adresa lui s pana inaintea primei aparitii a unui caracter cu codul ASCII = 0 |
strlwr(s) |
transforma majusculele din s in minuscule |
strupr(s) |
transforma minusculele din s in majuscule |
strcmp(s1,s2) |
compara lexicografic stringurile s1 si s2 ;. functia strcmp returneaza o valoare pozitiva daca s1>s2 dpdv lexical; returneaza 0 daca s1==s2 ; returneaza o valoare negativa daca s1<s2 lexical |
ex.
strcmp("ana","Ana Maria"); //>0 ('a'>'A')
Obs.:
cand stringurile difera, functia strcmp
returneaza pozitia pe care prima oara cele doua stringuri difera (cu semn)
Functie | Descriere |
---|---|
stricmp(s1,s2) |
se compara stringurile s1 si s2 fara a se face distinctie intre minuscule si majuscule |
ex. |
stricmp("ana","Ana Maria"); //<0 (-4)
Functie | Descriere |
---|---|
strset(s,c) |
toate caracterele stringului s devin egale cu caracterul c |
ex.
char s[100];
strcpy(s,"test");
strset(s,'*'); //s="****"
Functie | Descriere |
---|---|
strncat(s1,s2,n) |
din s2 se iau cel mult n caractere si se adauga la sfarsitul stringului s1 |
strncpy(s1,s2,n) |
din s2 se iau cel mult n caractere si se salveaza in s1 |
strnset(s,c,n) |
seteaazza primele n caractere din s la valoarea c |
strrev(s) |
oglindeste textul retinut in s |
ex.
char s;
strcpy(s,"Test");
strrev(s); //s="tseT"
Este o functie folosita pentru toker-izare, pentru divizarea unui string in substringuri infunctie de unul sau mai multe caractere delimitator. ex.: Ruperea unui text in cuvinte.
char* delim=" .,:?!()-";
gets(s);
char* p=strtok(s,delim);
while(p)
{
puts(p);
p=strtok(NULL,delim);
}
La primul apel al functiei strtok
se initiaza toker-izarea stringului primit in primul parametru al functiei.
Daca este gasit un cuvant (token) in s
, se returneaza adresa unde acel token a fost depus in memorie.
incepand cu al doilea apel al functiei strtok
, al doilea parametru al functiei primeste valoarea NULL
, semn ca
vrem sa continuam toker-izarea intiata anterior. cu apelurile functiei strtok
cu valoarea NULL
se returneaza
succesiv toti tokenii gasiti.
O variabila locala intr-o functie poate fi declarata ca fiind statica folosind cuvantul rezervat static
.
ex.
static int n;
Spre deosebire de o variabila locala obisnuita, variabila statica isi pastreaza valoarea la revenirea in functie.
void teststatic()
{
static int n=8;
n++;
printf("%d\n",n);
}
void main()
{
for(int i=7;i<10;i++)
teststatic();
}
O variabila locala nestatica, la apelul functiei intra in stiva de executie si la parasirea functiei, iese din stiva.
O variabila statica ramane permanent in memorie.
In exemplul de mai sus, variabilei n
, la pornirea programului i se aloca o zona de memorie care se elibereaza
abia la inchiderea programului si in aceasta locatie se depune initial valoarea 8
.
O functie in C poate fi declarata ca fiind statica.
ex.
static void test()
{
...
}
O functie declarata statica este cunoscuta numai in interiorul fisierului in care apare.
Implementarea unei functii asemanatoare strtok
folosind o variabila statica, functia implentata nu va distruge stringul primit pentru token-izare.
Functia noastra va folosi un singur caracter delimitator. Fiecare token gasit va fi returnat intr-o locatie de memorie noua.
char mystrtok(const char* s, char d)
{
static int poz=0;
if(s)
poz = 0;
int l = strlen(s);
if(poz>=l)
return NULL;
char* p = strcht(s+poz,d);
if(p)
{
char* r=(char*)malloc(p-s-poz+l);
strncpy(r,s+poz,p-s-poz);
r[p-s-poz+1]='\0';
poz=p-s+1;
return r;
}
poz=l;
char* r=(char*)malloc(strelen(s+poz)+1);
strcpy(r,s+poz);
return r;
}
Variabila poz
retine pozitia de la care se face cautarea in string. La primul apel se face cautare de la inceput,
atunci cand trimitem string si poz
devine 0
. Functia returneaza tokenul gasit intr-o locatie alocata dinamic. Daca nu se gaseste token, se returneaza valoarea NULL
.
void main()
{
char s[100];
gets(s);
char* p=mystrtok (s, ' ');
while (p)
{
puts(p);
free(p);
p=mystrtok(NULL, ' ');
}
}