std::strchr în C++

Caută un caracter (strchr) sau un text (strstr) într-un șir C și returnează pointer la el.

Sintaxă
#include <cstring>
const char* strchr(const char* sir, int c);
const char* strstr(const char* sir, const char* cautat);

Ce face std::strchr

strchr(s, c) caută prima apariție a caracterului c, iar strstr(s, t) prima apariție a textului t. Ambele returnează un pointer chiar la locul găsit, sau nullptr dacă nu există.

Din pointer afli poziția prin scădere: p - s. Pointerul poate fi folosit și ca un șir nou care începe de acolo (de exemplu, pentru a afișa restul textului).

Parametri

Parametru Descriere
sir Șirul în care se caută.
c / cautat Caracterul sau textul căutat.

Ce returnează

Pointer la prima apariție, sau nullptr.

Exemple

Exemplul 1: Domeniul unei adrese de e-mail

#include <cstdio>
#include <cstring>

int main() {
    const char* email = "ana@dexblog.ro";
    const char* aron = std::strchr(email, '@');
    if (aron != nullptr) {
        std::printf("Poziția lui @: %td\n", aron - email);
        std::printf("Domeniu: %s\n", aron + 1);
    }
}

Rezultat

Poziția lui @: 3
Domeniu: dexblog.ro

Exemplul 2: Căutarea unui cuvânt

#include <cstdio>
#include <cstring>

int main() {
    const char* mesaj = "Comanda a fost livrată în Iași";
    const char* cuvinte[] = {"livrată", "anulată"};
    for (const char* cuv : cuvinte) {
        const char* p = std::strstr(mesaj, cuv);
        if (p) {
            std::printf("\"%s\" găsit la poziția %td\n", cuv, p - mesaj);
        } else {
            std::printf("\"%s\" nu apare\n", cuv);
        }
    }
}

Rezultat

"livrată" găsit la poziția 15
"anulată" nu apare

Greșeli frecvente

  • Folosești rezultatul fără să verifici nullptr: dacă textul nu există, accesul prin pointer este comportament nedefinit.
  • Cauți o literă cu diacritice cu strchr: „ș” are doi octeți și nu încape într-un singur caracter. Folosește strstr cu textul "ș".

Comenzi înrudite

  • std::string::find: Caută un text și returnează poziția primei (find) sau ultimei (rfind) apariții, ori npos.
  • std::strcmp: Compară două șiruri C: 0 dacă sunt egale, negativ sau pozitiv după ordinea lor.
  • std::strlen: Returnează lungimea unui șir C, numărând octeții până la terminatorul \0.