Skip to content

Latest commit

 

History

History
194 lines (170 loc) · 6.76 KB

FP_22_C_2021-12-16.md

File metadata and controls

194 lines (170 loc) · 6.76 KB

STRINGURI IN C

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"

strtok:

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.

VARIABILE STATICE

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.

FUNCTII STATICE IN C

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, ' ');
    }
}