string find și npos: poziția zero este validă
Verifică rezultatul căutării într-un string fără să confunzi indicele zero cu absența. Explică npos, tipul poziției și căutările repetate.
În acest material
Dacă textul începe cu fragmentul căutat, find întoarce poziția 0. Aceasta este o căutare reușită. Folosirea rezultatului direct ca valoare adevărat sau fals poate inversa interpretarea: zero devine fals, iar valoarea specială pentru absență nu este zero.
Compară explicit cu npos
std::string::npos este valoarea specială folosită pentru a semnala că o poziție nu a fost găsită. Verificarea unei căutări este „rezultatul diferă de npos”, nu „rezultatul este nenul”. Păstrează tipul rezultatului, de exemplu prin deducere cu auto, în loc să îl înghesui automat într-un int.
În textul banana, căutarea lui ban întoarce 0, căutarea lui ana întoarce 1, iar căutarea lui xyz întoarce npos. Aceste trei cazuri trebuie testate separat, deoarece diferențiază începutul, interiorul și absența.
Poziția este de la zero
Indicele 1 din banana desemnează al doilea caracter. Dacă enunțul cere poziții numerotate de la 1, adaugi unu numai după ce ai confirmat că rezultatul este o poziție validă. Nu transforma npos într-un presupus răspuns printr-o operație aritmetică.
Funcția caută un fragment consecutiv. Nu găsește o selecție de litere separate prin alte caractere. De asemenea, căutarea obișnuită distinge majusculele de minuscule; orice regulă de ignorare a diferenței trebuie implementată și definită separat.
În banana, find pentru ban întoarce 0, pentru ana întoarce 1, iar pentru xyz întoarce npos. Numai npos înseamnă absent.Mărește schema ↗
Căutările repetate trebuie să avanseze
După o apariție găsită la p, poți continua de la p+1 dacă vrei să accepți suprapuneri. Pentru aaaa și modelul aa, începuturile sunt 0,1,2. Dacă avansezi cu lungimea modelului, obții doar apariții fără suprapunere.
Modelul gol necesită atenție separată în buclele de căutare: trebuie să ai o regulă clară de progres și oprire. Pentru o primă implementare didactică, poți cere explicit un model nevid și poți verifica această precondiție.
Legătura cu char[]
În reprezentarea clasică, funcțiile de căutare pot întoarce un pointer, nu un indice. Absența se verifică după contractul acelei funcții. Nu transfera mecanic verificarea npos către un pointer sau verificarea unui pointer către un indice numeric.
Revezi funcțiile de căutare în șiruri, char[] și string și comparația textelor. Contractul căutării este descris în specificația string.
Întrebări frecvente
De ce if(text.find(fragment)) poate da răspunsul greșit?
O potrivire la început are poziția 0, interpretată ca fals. Absența este semnalată prin std::string::npos, nu prin zero. Compară explicit rezultatul cu npos.
Ce înseamnă std::string::npos?
Este valoarea specială prin care operațiile de căutare semnalează lipsa unei poziții. Nu este un indice valid pe care să îl folosești pentru acces în text.
În ce tip păstrez rezultatul lui find?
Păstrează tipul returnat, de exemplu prin auto, sau folosește tipul de poziție al șirului. Conversia automată într-un int poate pierde informație și complică verificarea față de npos.