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știfind. - 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.