# Șiruri de caractere în C++

> Pagina: https://bacalaurescu.ro/informatica/lectii/siruri-de-caractere/prelucrarea-sirurilor
> Markdown: https://bacalaurescu.ro/informatica/lectii/siruri-de-caractere/prelucrarea-sirurilor.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

Declararea, funcțiile din cstring și prelucrările clasice cerute la BAC.

## Pe scurt pentru BAC

- Un șir de caractere în stil BAC este un vector de `char` terminat cu caracterul nul `'\0'`.
- `strlen(s)` dă lungimea fără `'\0'`, `strcpy(d, s)` copiază s în d, iar `strcat(d, s)` lipește s la finalul lui d.
- `strcmp(a, b)` dă 0 dacă șirurile sunt egale și o valoare negativă dacă a e înaintea lui b lexicografic.
- Cu `strchr(voc, s[i]) != 0` verifici dacă un caracter apare în șirul de vocale.
- Un caracter din intervalul `'a'...'z'` devine majusculă cu `s[i] = s[i] - 'a' + 'A'`.

## Declarare

În C++ (stil BAC), un șir de caractere este un vector de tip char terminat cu caracterul nul `'\0'`:

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

`cin >> s` citește până la primul spațiu; `cin.getline` citește toată linia, cu spații.

## Funcțiile din `<cstring>`

| Funcție | Efect |
|---|---|
| `strlen(s)` | lungimea (fără `'\0'`) |
| `strcpy(d, s)` | copiază s în d |
| `strcat(d, s)` | lipește s la finalul lui d |
| `strcmp(a, b)` | 0 dacă egale; negativ dacă a înaintea lui b lexicografic |
| `strchr(s, c)` | adresa primei apariții a caracterului c |

**Exemplu:** pentru `s = "BAC"`, `strlen(s)` este `3`.

## Prelucrări clasice

**Numărarea vocalelor:**

```cpp
#include <iostream>
#include <cstring>
using namespace std;
int main() {
    char s[101], voc[] = "aeiouAEIOU";
    int nr = 0;
    cin.getline(s, 101);
    for (int i = 0; i < strlen(s); i++)
        if (strchr(voc, s[i]) != 0) nr++;
    cout << nr;
    return 0;
}
```

Pentru intrarea `bacalaureat`, programul afișează `6` (a, a, a, u, e, a).

**Transformare literă mică în mare:** `s[i] = s[i] - 'a' + 'A'` pentru caractere din intervalul `'a'...'z'`.

> [!ATENTIE]
> `strcmp(a, b) == 0` înseamnă șiruri EGALE. Scrierea `if (strcmp(a, b))` testează exact contrariul (diferite): sursa clasică de bug la BAC.

## Greșeli frecvente

1. Compararea șirurilor cu `==` compară adrese, nu conținut: folosește `strcmp`.
2. `cin >> s` se oprește la spațiu: pentru propoziții folosește `cin.getline`.
3. Vectorul trebuie dimensionat cu un loc în plus pentru `'\0'`.
