MySQL Java JavaScript PHP Python HTML-CSS C-sharp C++ Go

Array-uri de caractere

Array-urile de caractere au particularitățile lor. La inițializare, putem transmite unui array de caractere fie un set de caractere, fie un șir de caractere (string):

char hello1[] {'h', 'e', 'l', 'l', 'o'};
char hello2[] {"hello"};    // {'h', 'e', 'l', 'l', 'o', '\0'}

La prima vedere, ambele array-uri conțin același set de caractere: în primul caz — un set de caractere separate, în al doilea caz — un șir de caractere. Totuși, array-ul hello1 va avea cinci elemente, în timp ce array-ul hello2 va avea șase elemente, deoarece la inițializarea cu un șir, caracterul nul '\0' este adăugat automat la sfârșit.

Modul de definire a unui array de caractere influențează modul de lucru cu acesta. Astfel, la afișarea în consolă, operatorul cout va afișa întregul șir până la caracterul '\0'.

La final trebuie neapărat să existe caracterul '\0', altfel în consolă vor fi afișate caractere din celulele de memorie următoare, care conțin valori nedeterminate, până când este întâlnit fie un caracter nul, fie apare un acces nepermis la memorie.

De exemplu, să comparăm afișarea a trei array-uri de caractere:

#include <iostream>
  
int main()
{   
    char hello1[]{'h', 'e', 'l', 'l', 'o'};
    char hello2[]{'h', 'e', 'l', 'l', 'o', '\0'};
    char hello3[]{"hello"};
     
    std::cout << hello1 << std::endl;
    std::cout << hello2 << std::endl;
    std::cout << hello3 << std::endl;
}

Exemplu de afișare în consolă:

hello╨J:╕╗☻
hello
hello

În primul caz, afișarea în consolă nu este deterministă, deoarece array-ul de caractere nu se termină cu caracterul nul '\0'.

Array-uri bidimensionale de caractere

Mai sus am văzut că un șir de caractere poate fi reprezentat ca un array de caractere. Atunci, cum putem reprezenta un array de șiruri?

Pentru aceasta, putem folosi un array bidimensional de caractere:

#include <iostream>
  
int main()
{   
    const int max_length{50}; // lungimea maximă a unui șir (inclusiv caracterul nul \0)
    char langs[][max_length] 
    {
        "C++", "C#",  "Python", "Java",
        "Kotlin", "Go", "Dart", "PHP"
    };
    std::cout << langs[0] << std::endl;     // C++
    std::cout << langs[1] << std::endl;     // C#
    std::cout << langs[2] << std::endl;     // Python
}

Aici, array-ul langs conține 8 elemente (8 șiruri). Numărul maxim de caractere (condiționat coloane) din fiecare șir este specificat prin constanta max_length. Însă șirurile din array nu trebuie neapărat să atingă această lungime. De exemplu, în șirul "C++" sunt doar patru caractere (3 + caracterul nul adăugat automat). Toate celelalte elemente primesc în mod implicit valori nule.

Și deoarece fiecare element al array-ului langs reprezintă un șir, putem obține șirul dorit după index și să-l afișăm în consolă.

Parcurgerea array-urilor bidimensionale de caractere

Deoarece array-urile imbricate reprezintă șiruri sau array-uri de caractere, putem afișa fiecare astfel de array în consolă sub formă de șir.

#include <iostream>
   
int main()
{
    char langs[][20] { "C++", "Python", "JavaScript"};
    for(auto lang : langs)
    {
        std::cout << lang << std::endl;
    }
}

Aici, la parcurgerea array-ului langs, fiecare element al său – un array de caractere – este plasat în variabila lang. Apoi, putem afișa acest array sub formă de șir în consolă.

Introducerea array-urilor de caractere / șirurilor de la consolă

Funcția getline() a fluxului cin citește o secvență de caractere, inclusiv spațiile. Implicit, citirea se oprește când este întâlnit caracterul de linie nouă '\n' (de exemplu, la apăsarea tastei Enter). Funcția getline() are două versiuni. Prima versiune primește doi parametri: primul parametru indică array-ul de caractere în care vor fi stocate datele introduse, iar al doilea parametru indică numărul maxim de caractere care trebuie stocate în array. Acest număr include caracterul de final al șirului – byte-ul nul '\0', care este adăugat automat la sfârșitul inputului:

#include <iostream>
  
int main()
{   
    const int max_length {100};    // numărul maxim de caractere citite
    char text[max_length] {};       // array pentru citirea șirului
    std::cout << "Enter some text:" << std::endl;
    // citim caracterele, inclusiv spațiile
    std::cin.getline(text, max_length);
    std::cout << "You entered:\n" << text << std::endl;
}

În acest caz, sunt citiți cel mult 100 de caractere în array-ul text.

Enter some text:
Hello FABRICADECODURI.COM
You entered:
Hello FABRICADECODURI.COM

O altă formă a funcției getline() acceptă și un al treilea parametru – caracterul care va acționa ca semnal de încheiere a introducerii. De exemplu:

#include <iostream>
  
int main()
{   
    const int max_length {100};    // numărul maxim de caractere citite
    char text[max_length] {};       // array pentru citirea șirului
    std::cout << "Enter some text:" << std::endl;
    // citim caracterele, inclusiv spațiile
    std::cin.getline(text, max_length, '!');
    std::cout << "You entered:\n" << text << std::endl;
}

Aici, semnul de exclamare ! este utilizat ca simbol de încheiere a introducerii, prin urmare, la citire, el nu va fi inclus în șir:

Enter some text:
Hello World!
You entered:
Hello World