std::string::find în C++

Caută un text și returnează poziția primei (find) sau ultimei (rfind) apariții, ori npos.

Sintaxă
std::size_t find(const std::string& text, std::size_t de_la = 0) const;
std::size_t find(char c, std::size_t de_la = 0) const;
std::size_t rfind(const std::string& text, std::size_t de_la = npos) const;
static const std::size_t npos = -1;

Ce face std::string::find

s.find(x) caută textul sau caracterul x și returnează poziția primei apariții. Cu al doilea parametru, căutarea începe de la o anumită poziție, ceea ce permite găsirea tuturor aparițiilor. rfind caută de la final spre început și găsește ultima apariție.

Dacă nu găsesc nimic, ambele returnează std::string::npos: o constantă egală cu cea mai mare valoare a tipului std::size_t (de obicei 18446744073709551615). Rezultatul se compară mereu cu npos, nu cu -1 sau 0.

Căutarea ține cont de litere mari și mici. Pozițiile sunt în octeți.

Parametri

Parametru Descriere
text / c Ce se caută: un șir sau un caracter.
de_la Poziția de la care începe căutarea.

Ce returnează

Poziția găsită, sau std::string::npos.

Exemple

Exemplul 1: Găsit sau nu?

#include <iostream>
#include <string>

int main() {
    std::string s = "Ana are mere și pere";
    std::size_t p = s.find("mere");
    if (p != std::string::npos) {
        std::cout << "\"mere\" la poziția " << p << '\n';
    }
    if (s.find("prune") == std::string::npos) {
        std::cout << "\"prune\" nu apare\n";
    }
    std::cout << "npos = " << std::string::npos << '\n';
}

Rezultat

"mere" la poziția 8
"prune" nu apare
npos = 18446744073709551615

Exemplul 2: Toate aparițiile unui cuvânt

Căutarea găsește și „la” din „land”: find caută text, nu cuvinte întregi.

#include <iostream>
#include <string>

int main() {
    std::string text = "la la land, la mare";
    std::size_t poz = text.find("la");
    int cate = 0;
    while (poz != std::string::npos) {
        std::cout << "găsit la " << poz << '\n';
        ++cate;
        poz = text.find("la", poz + 1);
    }
    std::cout << "Total: " << cate << '\n';
}

Rezultat

găsit la 0
găsit la 3
găsit la 6
găsit la 12
Total: 4

Exemplul 3: Extensia unui fișier cu rfind

Ultimul punct desparte extensia, chiar dacă numele mai conține puncte.

#include <iostream>
#include <string>

int main() {
    for (std::string fisier : {"poza.vacanta.jpg", "raport.pdf", "README"}) {
        std::size_t punct = fisier.rfind('.');
        if (punct == std::string::npos) {
            std::cout << fisier << ": fără extensie\n";
        } else {
            std::cout << fisier << ": " << fisier.substr(punct + 1) << '\n';
        }
    }
}

Rezultat

poza.vacanta.jpg: jpg
raport.pdf: pdf
README: fără extensie

Greșeli frecvente

  • Scrii if (s.find(x)): găsirea la poziția 0 este tratată ca „negăsit”, iar npos ca „găsit”. Compară explicit cu std::string::npos sau folosește contains (C++23).
  • Salvezi rezultatul în int: npos nu încape și comparațiile ies greșit. Folosește std::size_t sau auto.

Comenzi înrudite