Cum funcționează
Problema e sora celei cu
numărarea cuvintelor — același flag inCuvant,
aceeași logică de tranziție. Diferă două lucruri, ambele importante.
Separatorii sunt mai mulți. Aici cuvintele se despart prin spații și virgule, iar exemplul
conține și spații multiple consecutive. În loc să scrii condiții tot mai lungi, funcția
esteSeparator ține totul într-un singur loc — dacă enunțul ar adăuga punctul sau punct-și-virgula,
modifici o singură linie.
Când se trece pe rând nou. Nu la fiecare separator — asta ar produce rânduri goale între cuvinte
la spațiile multiple din exemplu. Ci doar când ieși dintr-un cuvânt, adică atunci când inCuvant
era true:
if (inCuvant) cout << endl;
La al doilea spațiu consecutiv, flagul e deja false, deci nu se mai face nimic. Același mecanism
rezolvă automat și separatorii de la începutul textului.
Afișarea se face caracter cu caracter, pe măsură ce parcurgi — nu e nevoie să construiești
cuvintele într-un șir separat. Literele aceluiași cuvânt ajung lipite pe același rând, iar endl
le desparte.
Ultimul cuvânt nu primește endl dacă textul nu se termină cu separator. Pentru un rând final
curat, adaugi un cout << endl; după buclă, dacă inCuvant a rămas true.
Greșeli frecvente
cout << endl la fiecare separator — spațiile multiple produc rânduri goale. Cea mai
frecventă greșeală, pentru că exemplul din enunț o testează explicit.
- Tratarea doar a spațiului —
mere, rămâne lipit de virgulă.
cin >> s — se citește doar primul cuvânt.
- Construirea cuvintelor într-un vector auxiliar — funcționează, dar e inutil de lung.
char s[100] — lipsește locul terminatorului pentru o propoziţie de exact 100 de caractere.