# Cuvintele dintr-un text: numărare și transformări

> Pagina: https://bacalaurescu.ro/informatica/lectii/siruri-de-caractere/cuvinte-dintr-un-text
> Markdown: https://bacalaurescu.ro/informatica/lectii/siruri-de-caractere/cuvinte-dintr-un-text.md
> Sursa: Bacalaurescu (bacalaurescu.ro), conținut gratuit pentru BAC 2027.

Materia: [Informatică](https://bacalaurescu.ro/informatica)

Capitolul: [Șiruri de caractere](https://bacalaurescu.ro/informatica/lectii/siruri-de-caractere)
Actualizat: 2026-11-01

Prelucrarea textelor cu spații: numărarea cuvintelor, inițiale și capitalizare.

## Pe scurt pentru BAC

- Un text care conține spații se citește întreg cu `cin.getline(s, 256)`.
- Textul se parcurge cu `for (int i = 0; s[i] != '\0'; i++)`, oprindu-te la caracterul nul de la final.
- La capitalizare schimbi doar literele mici de la început de cuvânt, folosind faptul că distanța dintre 'a' și 'A' e constantă (32).
- Cu `strtok`, primul apel primește șirul, iar următoarele primesc `0`; funcția pune `'\0'` în locul separatorilor.
- Inițialele se afișează cu condiția de început de cuvânt, de exemplu „limba si literatura romana” dă `lslr`.

## Citirea unui text cu spații

```cpp
char s[256];
cin.getline(s, 256);
```

## Numărarea cuvintelor

Un cuvânt nou începe acolo unde caracterul curent NU e spațiu, iar cel dinainte E spațiu (sau suntem la început):

```cpp
int nr = 0;
for (int i = 0; s[i] != '\0'; i++)
    if (s[i] != ' ' && (i == 0 || s[i-1] == ' '))
        nr++;
```

Pentru `"ana are  mere"` (cu două spații la mijloc): nr = 3 ✓: metoda e robustă la spații multiple.

## Afișarea inițialelor

Aceeași condiție de "început de cuvânt":

```cpp
for (int i = 0; s[i] != '\0'; i++)
    if (s[i] != ' ' && (i == 0 || s[i-1] == ' '))
        cout << s[i];
```

Pentru `"limba si literatura romana"`: afișează `lslr`.

## Prima literă mare la fiecare cuvânt (capitalizare)

```cpp
for (int i = 0; s[i] != '\0'; i++)
    if (s[i] >= 'a' && s[i] <= 'z' && (i == 0 || s[i-1] == ' '))
        s[i] = s[i] - 'a' + 'A';
```

`"ion popescu"` devine `"Ion Popescu"`. Conversia folosește aritmetica pe coduri: distanța 'a'-'A' e constantă (32).

## Extragerea cuvintelor cu strtok (varianta din manuale)

```cpp
#include <cstring>
char *p = strtok(s, " ");
while (p != 0) {
    cout << p << "\n";
    p = strtok(0, " ");
}
```

Primul apel primește șirul, următoarele primesc `0`; strtok MODIFICĂ șirul original (pune '\0' în locul separatorilor).

> [!RETINE]
> Condiția universală de "început de cuvânt": s[i] != ' ' && (i == 0 || s[i-1] == ' '). Cu ea rezolvi numărarea, inițialele și capitalizarea, robust la spații multiple.

## Greșeli frecvente

1. Numărarea spațiilor + 1 NU dă numărul de cuvinte când există spații consecutive sau la margini.
2. strtok distruge șirul: fă o copie dacă îl mai folosești.
3. Conversia la majusculă doar pentru litere mici: fără condiția a-z, strici cifrele și semnele.
