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.
Chiar dacă în definiția funcției parametrul caracter este 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 în sir.

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 p reține adresa primei apariții a caracterului c în text;
  • dacă strchr() nu returnează NULL, înseamnă că am găsit caracterul la o oarecare poziție, deci contorizăm în k;
  • continuăm căutarea de la următoarea adresă (următorul caracter) din text, adresă aflată pe poziția p + 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.
Amintim iar că funcția așteaptă parametrul caracter ca 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.