Cum funcționează
Capcana enunțului e explicită: masini conține „si", dar nu se numără. Deci nu poți căuta
subşiruri — trebuie să compari cuvinte întregi.
Soluția elegantă e să lași >> să facă munca. Operatorul >> se oprește automat la spații, deci
citește exact câte un cuvânt:
while (f >> cuvant)
Astfel delimitarea cuvintelor se rezolvă singură, fără să cauți spații manual. Iar strcmp compară
cuvântul întreg cu cel căutat — "masini" nu va fi niciodată egal cu "si".
Bucla while (f >> cuvant) merită înțeleasă: citirea returnează o valoare care devine false când
fişierul s-a terminat. Este tiparul standard pentru „citește până la sfârșitul fişierului", util
oriunde nu știi dinainte câte valori sunt.
strcmp returnează 0 la egalitate — nu 1, cum ar sugera intuiția. Valoarea returnată e
diferența dintre șiruri în ordine alfabetică: negativă dacă primul e „mai mic", pozitivă dacă e „mai
mare", zero dacă sunt identice. De aceea condiția e strcmp(a, b) == 0. Necesită
#include <cstring>.
Ca la interschimbarea liniilor unei matrici,
datele vin din două surse: textul din fişier (f >>), cuvântul căutat de la tastatură
(cin >>).
Dacă enunțul ar cere apariții inclusiv în interiorul altor cuvinte, ai citi tot rândul cu
getline și ai căuta cu strstr. Aici se cere exact opusul.
Greșeli frecvente
- Compararea cu
== (if (cuvant == cautat)) — compară adresele din memorie, nu conținutul.
Rezultatul e aproape întotdeauna 0. Se folosește strcmp.
strcmp(...) == 1 — funcția returnează 0 la egalitate, nu 1.
- Căutarea ca subșir, cu
strstr — numără și apariția din masini, deci rezultat 3 în loc de
2.
- Citirea textului cu
getline și despărțirea manuală după spații — funcționează, dar e mult
mai lung; >> face deja asta.
- Lipsa lui
#include <cstring> — eroare de compilare la strcmp.