Vectori de caractere

1.1. Declararea vectorilor de caractere

Forma generala de declarare a unui sir de caractere:

char nume_sir[dimendiune];

Exemplu:

char s1[10];

char s2[10]="sirul 2";

char s3[]="sirul 3";

unde:

    • s1 = vector de caractere care poate conţine maxim 9 caractere (s-au alocat 10 octeţi).

    • s2 = vector de caractere care poate conţine maxim 9 caractere şi care conţine 7 caractere (s-au alocat 10 octeţi).

    • s3 = vector de caractere care poate conţine maxim 7 caractere şi car conţine 7 caractere (s-au alocat 8 octeţi).

Greşeli:

char s4[];

char s5[5]="abcdef";

unde:

s4 =s-au alocat 0 octeţi = eroare de compilare

s5 =s-au alocat 5 octeţi şi s-au iniţializat primele 6 poziţii = eroare de compilare

Atenţie !!

Dacă instrucţiunile programului adaugă caractere unui şir de caractere, depăşind astfel spaţiul alocat, operaţiile se vor efectua eronat. Este posibil să se modifice astfel alte variabile. Se recomandă alocarea unui spaţiu suficient de mare pentru evitarea unui astfel de caz.

1.2. Vizualizarea unui şir de caractere (modul de memorare)

Fie urmatoarea declatie

char s[15]=”LIMBAJUL C++”;

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14

unde:

    • s-au alocat 15 octeţi

    • s-a memorat şirul de lungime 12

    • după ultimul caracter din şir a fost adăugat automat caracterul NULL (’\0’ adică caracterul cu codul ASCII 0) indicând astfel sfârşitul şirului.

    • au rămas liberi 2 octeţi

Explicaţii: Pentru memorarea unui şir de caractere, compilatorul reţine doar adresa primului caracter din şir. Celelalte caractere vor fi memorate folosind octeţii următori.

Compilatorul indică sfârşitul şirului de caractere plasând un caracter ’\0’ (caracterul cu codul ASCII 0) după ultimul caracter din şir. Astfel, un şir de caractere este identificat de compilator prin adresa de început (adresa primului caracter din şir) şi primul caracter ’ \0’ găsit printre octeţii următori primului caracter.

Exemplu:

char s1[11]="Informatica";

char s2[100]="sir de lungime maxima 99";

cout <<"s1: "<< s1 << endl;

s2[5]=’\0’;

cout <<"s2: "<< s2 << endl;

Se va afişa:

s1: Informaticasir de lungime maxima 99

s2: sir d

Explicaţii:

    • Şirul s1 conţine 11 caractere. Pentru acest şir s-au alocat 11 octeţi. Dintre cei 11 octeţi alocaţi, unul ar fi trebuit să fie rezervat pentru ‘\0’. Iniţializând şirul cu 11 caractere, caracterul ‘\0’ nu a mai fost plasat la sfârşitul şirului.

    • Şirul s2 conţine 25 de caractere. Pentru a-l memora, compilatorul i-a alocat un spaţiu de 100 de octeţi începând (din întâmplare) de la adresa imediat următoare sfârşitului lui s1.

    • Datorită faptului că la sfârşitul şirului s1 nu există ‘\0’, pentru a-l afişa, compilatorul parcurge octeţii succesivi de memorie până la găsirea unui alt ‘\0’. Acesta se va afla la sfârşitul lui s2.

    • Al cincilea caracter din s2 a fost înlocuit cu ‘\0’. Pentru a-l afişa pe s2, compilatorul parcurge octeţii succesivi, începând cu adresa primului caracter din s2, până la întâlnirea unui ‘\0’. Acest ‘\0’ va fi găsit pe poziţia 5. Astfel compilatorul consideră că acolo se termină şirul s2.

Observaţie:

Caracterul ‘a’ se memorează pe 1 octet, pe când şirul de caractere “a” se memorează pe doi octeţi:

a

Caracterul ‘a’

a

\0

Şirul de caractere “a”

1.3. Afişarea vectorilor de caractere.

Afisarea unui vector de caractere se poate realiza in doua feluri si anume:

    • ca o variabila neindexata, precizând doar numele sirului în cadrul instructiunii cout

    • sau la fel ca afisarea oricarui vector, element cu element, începand cu elementul aflat pe prima pozitie (pozitia 0) pana la marcatorul de sfârșit de sir('\0').

Exemplu:

int main ()

{

char s[20]="Lectii de informatica";

// varianta 1

cout <<s;

// varianta 2

for (int i=0; s[i]; i++)

cout <<s[i];

return 0;

}

1.4. Citirea vectorilor de caractere.

Citirea elementelor unui vector se poate realiza în trei moduri diferite:

    • ca o variabilă neindexată, precizând numele șirului în cadrul instrucțiunii cin

    • folosind comanda cin.get()

    • sau la fel ca citirea oricarui vector, element cu element, începand cu elementul aflat pe prima pozitie (pozitia 0) pana la marcatorul de sfârșit de sir('\0').

  • Exemplu:

char c, s[150];

int main (void)

{

// Varianta 1

cin >> s;

// Varianta 2

cin.get();

cin.get(s,100);

return 0;

}

Explicaţii:

    • Varianta 1: Se vor citi toate caracterele până la întâlnirea primului spaţiu. După ultimul caracter se adaugă ‘\0’. Ex. Dacă se introduce de la tastatură şirul: “informatica este”, după apăsarea tastei ENTER, şirul va conţine “informatica”, lungimea acestui şir este 11 şi s[11] va fi egal cu ‘\0’.

    • Varianta 2: Şirul este citit cu ajutorul funcţiei cin.get() care are trei parametri:

      • cin.get (vector_de_caractere, int nr, char c=‘\n’)

    • unde:

      • vector_de_caractere = vectorul în care vor fi memorate caracterele citite;

      • nr = numărul maxim de caractere care se vor citi;

      • c = caracterul care determină oprirea citirii.

  • Observații:

    • - sunt citite şi caracterele albe (spaţiu, tab)

    • - caracterul trimis ca al treilea parametru nu se adaugă la şir;

    • - după ultimul caracter se adaugă automat ‘\0’

    • - ultimul parametru este opţional, în cazul în care lipseşte se consideră că este ‘\n’

    • Modul de funcţionare a funcţiei: Se citesc caractere de la tastatură până la apăsarea tastei ENTER.

    • Dacă numărul de caractere tastate este mai mic decât nr şi nu a fost întâlnit caracterul c (implicit ‘\n’) atunci se vor memora toate caracterele.

    • Dacă numărul de caractere tastate este mai mare decât nr şi nu a fost întâlnit caracterul c printre primele nr-1 caractere, atunci se vor memora primele nr-1 caractere din cele tastate.

    • Dacă printre primele nr-1 caractere tastate se găseşte caracterul c atunci se vor memora doar caracterele introduse înaintea lui c.

    • Funcţia cin.get() utilizează o zonă intermediară de memorie (buffer) astfel:

        • Se memorează în buffer caracterele care s-au tastat până la apăsarea tastei ENTER.

        • Se analizează pe rând primele nr-1 caractere (dacă există nr-1 caractere) din buffer testându-se dacă printre aceste caractere se află caracterul c. Dacă se întâlneşte caracterul c, atunci, toate caracterele tastate înaintea lui c vor fi adaugate şirului şi vor fi eliminate din buffer aceste caractere şi caracterul c din buffer.

    • Din acest motiv, folosirea repetată a funcţiei cin.get () poate funcţiona eronat. Motivul este că, după executarea unei citiri, este posibil ca bufferul să nu se golească complet.

    • Se va utiliza :

    • cin.get (s1, 100);

    • cin.get(); // se mai citeşte un caracter din buffer – cu scopul de a elimina acest caracter cin.get(s2, 100);