Functii predefinite pentru prelucrarea sirurilor de caractere in C++
Am discutat data trecuta in ultimul video despre ce este un caracter si un sir de caractere. Astazi vom continua acest capitol impreuna si va voi prezenta cateva functii utile atunci cand abordam probleme ce se rezolva folosind sirurile de caractere.
Aceste functii ne ajuta atunci cand trebuie sa lucram cu siruri de caractere, si este esential sa stim urmatoarele aspecte:
- Ce face functia
- Ce primeste ca parametrii
- Ce returneaza
Mare atentie! Atunci cand folosim functii ce prelucreaza siruri de caractere, noi transmitem de fapt un pointer catre acel sir. Am prezentat mai multe despre pointeri, in acest articol: Pointeri in C++ | Introducere . Asadar, atunci cand voi spune “functia primeste ca si parametru / parametrii un sir de caractere” voi sa va ganditi tot timpul ca aceasta primeste un pointer catre inceputul acestui sir.
Vom prezenta mai intai ce face fiecare functie, cum se foloseste, iar mai apoi vom implementa manual fiecare functie, deoarece consider ca trebuie sa intelegi exact conceptul “din spate”, nu doar sa folosesti functia orbeste.
Inainte de a va prezenta ce fac urmatoarele functii, salveaza undeva urmatorul link, deoarece aceasta este documentatia oficiala C++ si aici se explica exact fiecare functie: <cstring> C++ Strings cplusplus.com .
De asemenea, ti-am pregatit urmatorul PDF in care sintetizez fiecare functie. Te sfatuiesc sa il printezi si sa il tii la indemana o perioada, pana te familiarizezi cu ele: PDF Functii predefinite – Siruri de caractere.
1. STRLEN – Determinarea lungimii unui sir de caractere
Aceasta functie are rolul de a afisa cate caractere contine un sir. Daca luam, spre exemplu, sirul de caractere “Ana”, atunci strlen(“Ana”) va returna 3, deoarece acesta contine 3 caractere.
Aceasta functie se foloseste de obicei cand completati formulare si ceea ce scrieti trebuie sa aiba un numar minim de caractere. De exemplu atunci cand parolele pe diferite site-uri trebuie sa aiba minim 6 caractere.
- Parametrii: sir de caracter
- Returneaza: lungimea unui sir
char s[128] = "ana"; cout << "strlen(s) = " << strlen(s); // 3
Implementarea functiei strlen():
unsigned int strlen(char s[]) { unsigned int i = 0; for(i = 0; s[i] != NULL; i++); return i; }
2. STRCAT – Concatenarea a doua siruri de caractere
Aceasta functie are rolul de a adauga la sfarsitul unui sir de caractere (destinatie) continutul unui alt sir (sursa). In exemplul de mai jos s2 va fi sirul sursa, iar s1 va fi sirul destinatie.
- Parametrii: sir sursa, sir destinatie
- NU returneaza nimic
char s1[128] = "merele sunt "; char s2[128] = "sanatoase"; strcat(s1, s2); cout << "strcat(s1, s2) = " << s1; // merele sunt sanatoase
Implementarea functiei strcat():
void strcat(char destinatie[], char sursa[]) { unsigned int i = 0; unsigned int j = 0; for(i = 0; destinatie[i] != NULL; i++); for(j = 0; sursa[j] != NULL; j++, i++) destinatie[i] = sursa[j]; destinatie[i] = '\0'; }
2.1 Functia strncat(s1, s2, n)
Aceasta functie merge exact ca si fratele lui mai mare, cu o mica modificare: concateneaza maxim n caractere. In momentul cand a lipit cele n caractere, aceasta se opreste.
3. STRCPY – Copierea unui sir de caractere intr-un alt sir de caractere
Aceasta functie are rolul de a copia continutul unui sir peste alt sir. Va puteti gandii la aceasta functie ca si echivalentul x = y; in momentul cand lucram cu numere intregi. Doar ca de data asta nu avem numere, avem siruri de caractere.
- Parametrii: sir sursa, sir destinatie
- NU returneaza nimic
char s[128] = "mere"; strcpy(s, "pere"); cout << "strcpy(s, \"mere\") = " << s; // pere
Implementarea functiei strcpy():
void strcpy(char destinatie[], char sursa[]) { unsigned int i = 0; for(i = 0; sursa[i] != NULL; i++) destinatie[i] = sursa[i]; destinatie[i] = '\0'; }
3.1 Functia strncpy(s1, s2, n)
Aceasta functie merge exact ca si fratele lui mai mare, cu o mica modificare: copiaza doar primele n caractere. Tineti minte aceasta functie, deoarece o vom folosii in urmatorul tutorial, unde vom vorbii despre problemele clasice ce apar atunci cand lucrezi cu siruri de caractere.
4. STRCMP – Compararea a doua siruri de caractere
In momentul cand ni se cere sa ordonam niste siruri lexicografic, trebuie automat sa ne gandim la aceasta functie. Are rolul de a compara doua siruri si returneaza 0 daca acestea sunt egale. In caz contrar, returneaza diferenta intre primele caractere care nu sunt egale in cele doua siruri.
- Parametrii: primul sir, al doilea sir
- Returneaza:
- < 0 – daca primul caracter diferit din s1 este mai mic decat cel din s2
- 0 – daca cele doua siruri sunt LA FEL
- > 0 – daca primul caracter diferit din s1 este mai mare decat cel din s2
char s[128] = "mere"; cout << "strcmp(s, \"mere\") = " << strcmp(s, "mere") << "\n"; // 0 cout << "strcmp(s, \"pere\") = " << strcmp(s, "pere"); // -3
Implementarea functiei strcmp():
int strcmp(char s1[], char s2[]) { unsigned int i = 0; for(i = 0; s1[i] != NULL && s2[i] != NULL && s1[i] == s2[i]; i++); if(s1[i] == NULL && s2[i] == NULL) return 0; else return s1[i] - s2[i]; }
4.1 Functia strncmp(s1, s2, n)
Aceasta functie merge exact ca si fratele sau mai mare, dar opreste compararea dupa primele n caractere. Este foarte utila atunci cand o sa lucram cu prefixele unui cuvant, dar mai multe detalii o sa vedeti in urmatorul tutorial.
5. STRCHR – Cautarea unui caracter intr-un sir
Folosim aceasta functie pentru a gasii un caracter intr-un sir. In cazul in care caracterul este gasit, se va returna un pointer catre inceputul acelui caracter in sir, iar in caz contrar se va returna NULL. Aceasta functie se foloseste de multe ori pentru a verifica daca exista o vocala intr-un cuvant dat.
- Parametrii: sir sursa, un caracter
- Returneaza: un pointer catre pozitia caracterului in sir
char s[128] = "Calul sare azi"; char *p = strchr(s, 'u') ; cout << "strchr(s, 'u') = " << p; // ul sare azi
Implementarea functiei strchr():
char* strchr(char sir[], char caracter) { for(unsigned i = 0; sir[i] != NULL; i++) { if(sir[i] == caracter) return sir+i; } return NULL; }
6. STRSTR – Cautarea unui subsir intr-un sir
Aceasta functie se foloseste pentru a gasii un sir in interiorul altui sir. In cazul in care sirul este gasit, se va returna un pointer catre inceputul acelui sir in sirul cel mare, iar in caz contrar se va returna NULL.
In practica, aceasta functie este folosita cand cautam ceva pe o pagina web, sau intr-un fisier Word / PDF (cu Ctrl+F).
- Parametrii: sirul in care cauta, sirul ce este cautat
- Returneaza: un pointer catre pozitia sirului cautat in sirul original
char s[128] = "Calul sare azi"; char *p = strstr(s, "sare") ; cout << "strstr(s, \"sare\") = " << p; // sare azi
Implementarea functiei strstr():
char* strstr(char sir[], char subSir[]) { for(unsigned i = 0; sir[i] != NULL; i++) { if(sir[i] == subSir[0]) { int gasit = 1, k = i + 1; for(unsigned j = 1; subSir[j] != NULL; j++) { if(sir[k] != subSir[j]) { gasit = 0; break; } k++; } if(gasit == 1) return sir + i; } } return NULL; }
De notat faptul ca nu este cea mai eficienta implementare 🙂 .
7. Functia STRTOK
Aceasta functie se foloseste in general atunci cand ai o propozitie si vrei sa lucrezi cu fiecare cuvant in parte. Este cea mai folosita functie intalnita in problemele de Bacalaureat, asa ca este esential sa stiti cum functioneaza!
- Parametrii: sirul in care cauta, sir cu separatori
- Returneaza: un pointer catre inceputul primului token gasit
char s[128] = "Calul sare azi"; char* cuvant = strtok(s, " "); cout << "strtok(s, \" \") = \n"; while(cuvant != NULL) { cout << "token: " << cuvant << "\n"; cuvant = strtok(NULL, " "); }