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”, iarnposca „găsit”. Compară explicit custd::string::npossau foloseștecontains(C++23). - Salvezi rezultatul în
int:nposnu încape și comparațiile ies greșit. Foloseștestd::size_tsauauto.
Comenzi înrudite
std::string::find_first_of: Caută primul sau ultimul caracter dintr-un set, sau primul caracter care nu e în set.std::string::contains: Verifică dacă șirul conține un anumit text sau caracter, oriunde în el (C++23).std::string::substr: Returnează o bucată nouă din șir: n caractere începând de la poziția poz.std::string::replace: Înlocuiește porțiunea de n caractere de la poziția poz cu alt text.