Biblioteca string

Pentru a realiza diferite prelucrări asupra șirurilor de caractere, putem, desigur, imagina diferiți algoritmi simpli. Mai simplu, însă, ar fi să folosim funcții predefinite, cuprinse în bibllioteca <string>. Vom face o enumerare, în cele ce urmează a celor mai uzuale, oferind și exemple de utilizare a lor.

**6.3.1 Funcția strlen**

Returnează lungimea unui şir de caractere, dat ca parametru (fără a lua în considerare caracterul nul). Sintaxă :

```
strlen(id_sir_caractere);

```

În exemplul următor se declară și se inițializează un șir de caractere cu cuvântul “Salut”, iar, apoi, se afișează sirul are 5 caractere, folosind funcția strlen.

```
char s[100]=”Salut”;
cout<<”sirul are ”<<strlen(s)<<" "<<"caractere";,

```

**6.3.2 Functia strcpy**

Funcția determină copierea unui șir sursă peste un șir destinație, incluzând caracterul NULL. Sintaxă:

```
strcpy(sir_destinatie,sir_sursa)

```

În exemplul următor, se copiază conținutul șirului s2 în șirul s1. Acesta își va pierde, deci, conținutul și va reține conținutul șirului s2.

```
char s1[20]="Salut",s2[20]="Buna ziua";
strcpy(s1,s2);

```

Funcția poate fi foarte utilă pentru a inițializa sau reinițializa un șir de caractere. Un exemplu ar putea fi: strcpy(s,””); caz în care șirul s va fi inițializat cu șirul vid. Desigur, acest lucru ar putea fi realizat și printr-o atribuire de forma s[0]=NULL;

Un exemplu interesant este următorul, în care funcția este utilizată pentru eliminarea tuturor aparițiilor caracterului c din șirul s.

```
#include <iostream>
#include <string.h>
using namespace std;
int main(){
   char s[10], c;
   cin.get(s,10);
   cin>>c;
   for(int i=0;i<strlen(s);i++)
        if(s[i]==c) strcpy(s+i, s+i+1);
   cout<<s;
   return 0;}

```

Observăm, în exemplu, că șirul s este adunat cu întregul i. Aritmetica aceasta este explicată, mai pe larg, în capitolul Pointeri. Vom spune, acum, că, de fapt, șirurile de caractere, ca toate celelalte tablouri, sunt pointeri și că, procedând astfel, obținem acces la al i-lea caracter al șirului.

**6.3.3 Functia strncpy**

Funcția determină copierea unui șir sursă peste un șir destinație, incluzând caracterul NULL. Sintaxă:

```
strcpy(sir_destinatie,sir_sursa)

```

**6.3.4  Funcția strcat**

Această funcție determină concatenarea a două șiruri, date ca parametri, adăugând șirului destinație șirul sursă. Sintaxa: strcat(sir\_destinatie,sir\_sursa);

Să urmărim exemplul:

```
char s1[20]="Buna ",s2[20]="ziua";
strcat(s1,s2);
cout<<s1;

```

Credem că este clar că, după execuție, șirul s1 va conține textul “Buna ziua”, care va fi, apoi, afișat.

**6.3.5 Funcția strncat**

Funcția este foarte asemănătoare funcției strcat, determinând concatenarea șirului destinație cu primele n caractere ale șirului sursă. Sintaxă:

```
strncat(sir_destinație,sir_sursă,n);

```

**6.3.6 Funcția strchr**

Caută prima apariție a unui caracter într-un șir de caractere, returnând  adresa acestuia, dacă este identificat, sau NULL, în caz contrar. Sintaxă: strchr(sir\_caractere, caracter);

Atât șirul de caractere, cât și caracterul pot fi variabile, ori constante din tipul respectiv. Putem, deci, scrie strchr(”exemplu”,’m’) la fel de bine precum putem scrie strchr(s,’m’), ori strchr(s,c).

Trebuie avut în vedere că utilizarea acestei funcții într-o sintaxă de tipul cout<<strchr(s,c); nu va produce afișarea poziției pe care caracterul c se află în șirul s, ci subșirul care începe de la această poziție. Explicația ține de tipul returnat de funcția strchr, care este pointer, precum șirul de caractere. Deci, plasat sub funcția cout, printr-un mecanism specific șirurilor de caractere, va determina afișarea conținutului, sub formă de șir, care se găsește la acea adresă.

Iată un exemplu de utilizare a funcției pentru a determina efectiv poziția pe care un caracter se găsește într-un șir.

```
char s[20],c;
cin.getline(s, 20);
cin>>c;
if(strchr(s, c)!=0) cout<<”caracterul apare pe pozitia“<<strchr(s,c)-s;

```

Am folosit, după cum se observă, aceeși “artimetică” a pointerilor, care ne permite să folosim strcpy pentru a șterge diferite caractere. Explicația este simplă. Scăzând din adresa returnată prin funcția noastră, adresa de la care este memorat șirul, obținem o diferență ce exprimă locațiile elementare de memorie aflate între cele două repere.

**6.3.7 Functia strstr**

Asemănător funcției strchr, această funcție determină adresa de început a unui subșir într-un șir, sau NULL, dacă subșirul nu este identificat. Forma generală este: strstr(sir,subsir);

Să analizăm exemplul următor:

```
char a[100]=”repere”, b[20]=”re”;
cout<<strstr(a,b);

```

Rezultatul execuției nu va fi afișarea valorii zero, corespunzătoare poziției pe care este determinată prima apariție a subșirului b în șirul a, ci chiar a șirului a. Explicația vine din definiția funcției, care returnează adresa unui șir de caractere, astfel încât, cout va produce, ca efect, afișarea șirului de caractere memorat de la acea adresă. Pentru a determina poziția numerică a primei apariții ar trebui să scădem din adresa returnată de funcție, adresa șirului. Vom rescrie exemplul anterior pentru a obține acest lucru:

```
char a[100]=”repere”, b[20]=”re”;
cout<<strstr(a,b)-a;

```

În cele ce urmează, vom scrie un exemplu ce are ca efect eliminarea tuturor aparițiilor unui subșir într-un șir, considerând că aceasta este o aplicație utilă a funcției.

```
#include <iostream>
#include<string.h>
using namespace std;
int main()
{
 int poz;
 char a[100], b[20];
 cin.getline(a,100);
 cin.getline(b,20);
 while(strstr(a,b))
{
         poz=strstr(a,b)-a;
         strcpy(a+poz, a+poz+strlen(b));
}
cout<<a;
return 0;
}

```

**6.3.8 Functia strcmp**

Funcția este folosită pentru compararea lexicografica a doua siruri de caractere. Forma generală este: strcmp(sir1, sir2 ); În urma apelului, funcția va returna valoare mai mică decât zero, dacă primul șir este mai mic, egală cu zero, dacă șirurile sunt egale, respectiv, mai mare decât zero, dacă primul șir este mai mare.

Practic, funcția compară caracter cu caracter cele două șiruri. Dacă primele n caractere sunt egale, iar caracterul n+1 din primul șir este inferior, alfabetic, caracterului al n+1-lea din șirul al doilea, atunci primul șir este considerat mai mic. Spre exemplificare, strcmp(“abac”, “abat”) este mai mic decât zero. La fel și strcmp(“aba”, “abac”), este mai mic decât zero.

**6.3.9 Funcțiile strlwr şi strupr**

Aceste funcții au ca efect transformarea tuturor caracterelor alfabetice ale unui șir fie în caractere minuscule (strlwr), fie în caractere majuscule (strupr). În următorul exemplu, șirul a va fi transformat cu ajutorul acestor funcții.

```
char a[100]="sir de CARACTERE";

cout<<strupr(a)<<endl<<strlwr(b);

```

Evident, am obține, pe primul rând, șirul “SIR DE CARACTERE”, iar pe al doilea “sir de caractere”.

**6.3.10 Functia strspn**

Funcția determină numărul de caractere dintr-un șir, care se regăsesc într-un alt șir. Forma generală:

```
strspn(sir1,sir2);

```

Rezultatul executării codului următor, va fi afișarea valorii 2, corespunzător numărului de caractere din șirul a, care se regăsesc în b.

```
char a[100]="abcd", b[20]="ab";
cout<<strspn(a,b);

```

Trebuie precizat că funcția verifică fiecare caracter din primul șir, astfel că, dacă am avea șirurile ca în exemplu:

```
char a[100]="aaabcd", b[20]="ab";
cout<<strspn(a,b);

```

rezultatul ar fi afișarea valorii 4, corespunzător numărului de caractere din a care se regăsesc în b.

**6.3.11 Functia strcspn**

Asemănător funcției strspn, această funcție determină numărul de caractere dintr-un șir, care nu se regăsesc în altul. Forma generală este:

```
strcspn(sir1,sir2);

```

În urma executării secvenței următoare, ar fi afișată valoarea 5, corespunzătoare numărului de caractere din șirul1, care nu se regăsesc printre  elementele șirului 2.

```
char a[100]="abcde", b[20]="fg";
cout<<strcspn(a,b);

```

**6.3.12 Funcții de conversie a valorilor numerice în șiruri de caractere (itoa, ltoa, gcvt, ecvt, fcvt)**

Pentru utilizarea acestor funcții este necesară biblioteca stdlib.h. Funcția itoa este utilizată pentru conversia unei valori de tip int către un șir de caractere, prin transformarea fiecărei cifre în carcter. Forma generală este:

```
itoa(numar, sir, baza_numeratie);

```

Să analizăm exemplul:

```
int nr=123;
char a[100];
itoa(nr,a,10);
cout<<a;

```

Prin utilizarea funcției itoa, șirul a va reține cifrele numărului nr, din reprezentarea acestuia în baza 10. Rezultatul afișării va fi, desigur “123”. Dacă, în loc de 10, am trece ca bază de numerație 2, am obține, însă “1111011”, corespunzător conversiei numărului 123 la baza 2.

Funcția ltoa are un efect identic, permițănd transformarea în șir de caractere a valorilor din tipul long. Sintaxa este, de asemenea, identică cu a funcției itoa.

Funcția fcvt este destinată conversiei numerelor de tip float la șir de caractere. Forma generală  este:

```
fcvt(numar, precizie, &semn, &punct);

```

unde număr reprezintă numărul care se dorește convertit, precizia reprezintă numărul de cifre după punctul zecimal, semn va reține poziția punctului zecimal, iar semn va primi o valoare corespunzătoare semnului valorii numerice (0 pentru pozitiv, diferit de 0 pentru valori negative).

În exemplul următor este convertită valoare 23.45 la șir de caractere. Rezultatul executării va fi afișarea șirului “2345”, pe prima linie, urmată, pe următoarele linii de 2, respectiv 0.

```
float nr=23.45;
int punct, semn, precizie=2;
char a[100];
strcpy(a, fcvt(nr,precizie, &punct, &semn));
cout<<a<<endl<<punct<<endl<<semn;

```