std::string::find_first_of în C++

Caută primul sau ultimul caracter dintr-un set, sau primul caracter care nu e în set.

Sintaxă
std::size_t find_first_of(const std::string& caractere, std::size_t de_la = 0) const;
std::size_t find_last_of(const std::string& caractere, std::size_t de_la = npos) const;
std::size_t find_first_not_of(const std::string& caractere, std::size_t de_la = 0) const;

Ce face std::string::find_first_of

Spre deosebire de find, care caută tot textul dat, aceste funcții primesc un set de caractere. find_first_of(",;") găsește prima virgulă sau primul punct și virgulă.

find_last_of caută ultimul caracter din set (de exemplu ultimul / sau \ dintr-o cale). find_first_not_of găsește primul caracter care nu este în set: cu " \t" afli unde începe textul după spațiile de la început.

Toate returnează npos dacă nu găsesc nimic. Setul lucrează cu octeți, deci nu poate conține litere cu diacritice ca unități întregi.

Parametri

Parametru Descriere
caractere Setul de caractere căutate (ordinea nu contează).
de_la Poziția de la care începe căutarea.

Ce returnează

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

Exemple

Exemplul 1: Primul separator și ultimul director

#include <iostream>
#include <string>

int main() {
    std::string rand = "Ana;9,50 Iași";
    std::cout << "Primul separator la: " << rand.find_first_of(";, ") << '\n';

    std::string cale = "/home/ana/documente/cv.pdf";
    std::size_t p = cale.find_last_of("/\\");
    std::cout << "Director: " << cale.substr(0, p) << '\n';
    std::cout << "Fișier: " << cale.substr(p + 1) << '\n';
}

Rezultat

Primul separator la: 3
Director: /home/ana/documente
Fișier: cv.pdf

Exemplul 2: Eliminarea spațiilor de la capete (trim)

#include <iostream>
#include <string>

std::string trim(const std::string& s) {
    const std::string spatii = " \t\n";
    std::size_t inceput = s.find_first_not_of(spatii);
    if (inceput == std::string::npos) return "";
    std::size_t sfarsit = s.find_last_not_of(spatii);
    return s.substr(inceput, sfarsit - inceput + 1);
}

int main() {
    std::cout << "[" << trim("   Ana Maria \t\n") << "]\n";
    std::cout << "[" << trim("     ") << "]\n";
}

Rezultat

[Ana Maria]
[]

Exemplul 3: Verificare: conține doar cifre?

#include <iostream>
#include <string>

int main() {
    for (std::string cnp : {"1960523225588", "19605A3225588"}) {
        bool doar_cifre = cnp.find_first_not_of("0123456789") == std::string::npos;
        std::cout << cnp << ": " << (doar_cifre ? "doar cifre" : "conține și altceva") << '\n';
    }
}

Rezultat

1960523225588: doar cifre
19605A3225588: conține și altceva

Greșeli frecvente

  • Folosești find_first_of("abc") crezând că găsește textul „abc”: găsește oricare dintre literele a, b, c. Pentru text întreg folosești find.
  • Pui litere cu diacritice în set: „ș” are doi octeți, iar funcția găsește oricare dintre ei, inclusiv în mijlocul altor litere (de exemplu „ț” are același prim octet).

Comenzi înrudite

  • std::string::find: Caută un text și returnează poziția primei (find) sau ultimei (rfind) apariții, ori npos.
  • std::string::substr: Returnează o bucată nouă din șir: n caractere începând de la poziția poz.
  • std::strchr: Caută un caracter (strchr) sau un text (strstr) într-un șir C și returnează pointer la el.