strchr()
Funcția strchr() caută într-un șir de caractere dat un caracter și returnează adresa primei apariții a acestuia.
Utilizarea funcției implică includerea bibliotecii <cstring> în program.
- Sintaxa
char* strchr(const char* sir, int caracter);- Parametri
-
sir: șirul în care se realizează căutarea;caracter: caracterul pe care îl căutăm.
caractereste definit cu tipul de datăint, noi putem trimite o variabilăchar; se realizează un cast care convertește caracterul în codul său ASCII. - Returnare
-
Funcția poate returna două valori:
- adresa din memorie a primei apariții a caracterului în șir;
NULL, dacă nu existăcaracterînsir.
Exemplu: Numărul de apariții
O problemă comună la care vom utiliza subprogramul strchr() are o cerință asemănătoare cu următoarea:
Afișați numărul de apariții ale caracterului c în șirul text, variabile citite de la tastatură.
Algoritm posibil:
#include <iostream>
#include <cstring>
using namespace std;
int main() {
char text[51], c;
int k = 0;
cin.getline(text, 51);
cin >> c;
char* p = strchr(text, c);
while(p != NULL) {
p = strchr(p + 1, c);
k++;
}
cout << "Caracterul " << c << " apare de " << k << " ori.";
return 0;
}
Nu mai ninge
n
Caracterul n apare de 2 ori.
Nu pot veni
a
Caracterul a apare de 0 ori.
Interpretarea algoritmului:
- se citesc pe rând variabilele;
- pointerul
preține adresa primei apariții a caracteruluicîntext; - dacă
strchr()nu returneazăNULL, înseamnă că am găsit caracterul la o oarecare poziție, deci contorizăm înk; - continuăm căutarea de la următoarea adresă (următorul caracter) din
text, adresă aflată pe pozițiap + 1; - repetăm căutările într-o buclă, până când nu mai există apariții.
Poziția numerică
Deoarece funcția strchr() ne returnează prima adresă la care găsește caracterul dorit, uneori s-ar putea să dorim să aflăm poziția numerică (indexul) la care a fost găsit caracterul. Putem afla această poziție calculând diferența (offset-ul în memorie) dintre adresa unde s-a găsit caracterul și adresa de început a textului.
În cod, am reprezenta în felul următor:
char text[] = "Doua cuvinte";
char caracter = 'u';
char* p = strchr(text, caracter);
int pozitie = p - text; // pozitie = 2
„Scăderea” dintre doi pointeri calculează de fapt diferența între adresele lor din memorie. În acest exemplu, caracterul căutat este găsit la 2 adrese de memorie distanță față de începutul textului, practic ceea ce numim noi index 2 în text.
strrchr()
Funcția strrchr() caută și returnează ultima apariție a unui caracter într-un șir dat.
Utilizarea funcției implică includerea bibliotecii <cstring> în program.
- Sintaxa
char* strrchr(const char* sir, int caracter);- Parametri
-
sir: șirul de caractere în care realizăm căutarea;caracter: caracterul căutat.
caracterca fiind un tip de datăint, noi totuși având posibilitatea să transmitem o variabilăchar, deoarece ea va fi automat convertită în valoarea corespunzătoare a codului ASCII. - Returnare
-
Funcția are două scenarii de returnare:
- adresa din memorie a ultimei apariții a caracterului în șir;
NULL, dacă nu a fost găsit caracterul în șir.
Exemplu de utilizare
Cu ajutorul funcției strrcpy() putem spre exemplu să identificăm extensia unui fișier.
#include <iostream>
#include <cstring>
using namespace std;
int main() {
char fisier[] = "exemplu.fisier.txt";
char* p = strrchr(fisier, '.');
if (p != NULL) {
cout << "Ultimul punct se afla la pozitia: " << (p - fisier) << endl;
cout << "Extensia fisierului este: " << p + 1 << endl;
} else {
cout << "Nu s-a gasit niciun punct." << endl;
}
return 0;
}
Ultimul punct se afla la pozitia: 22
Extensia fisierului este: txt
Pentru a nu include și caracterul punct, am afișat p + 1, însemnând tot ce se află în șir după ultimul punct. Pentru cazul nostru, extensia fișierului.