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

Introducere în șiruri de caractere

Putem lucra cu șiruri de caractere în C++ în așa-numitul stil C, ca și cu array-uri de caractere care se termină cu byte-ul nul '0'. Totuși, dacă acest caracter nu este găsit sau, în urma manipulărilor cu șirul, este eliminat, atunci acțiunile ulterioare cu acest șir pot avea un rezultat nedeterminist. Din acest motiv, șirurile în stil C sunt considerate nesigure, iar în C++ este recomandat să se folosească tipul std::string din modulul <string> pentru stocarea șirurilor.

Un obiect de tip string conține o secvență de caractere de tip char, care poate fi și goală. De exemplu, definirea unui șir gol:

std::string message;

Se poate, de asemenea, inițializa sau atribui o valoare concretă unei variabile de tip string:

std::string message {"Hello FABRICADECODURI.COM!"};
// sau așa
std::string message2 = "Hello FABRICADECODURI.COM!";
std::string message3("Hello FABRICADECODURI.COM!");

În acest caz, variabila message va primi o copie a literalului de șir "Hello fabricadecoduri.com!". În reprezentarea internă, variabila message va stoca un array de caractere, care se termină, de asemenea, cu byte-ul nul. Totuși, implementarea tipului string și funcționalitățile oferite de acesta fac ca lucrul cu acest tip să fie mai sigur.

Se poate și inițializa un obiect string cu un alt obiect string:

std::string hello{"hello world"};
std::string message {hello}; // message = "hello world"
// sau așa
// std::string message (hello);
// std::string message = hello;

Putem afișa un astfel de șir în consolă:

#include <iostream>
#include <string>
 
int main()
{
    std::string message {"Hello FABRICADECODURI.COM!"};
    std::cout << "Message: " << message << std::endl; // Message: Hello FABRICADECODURI.COM!
}

Accesarea și modificarea caracterelor dintr-un șir

Similar cu un array, putem accesa caractere individuale dintr-un șir prin intermediul indicilor, le putem obține și modifica:

std::string hello {"Hello"};
char c {hello[1]};      // e
hello[0]='M';
std::cout << hello << std::endl;    // Mello

Deoarece obiectul string reprezintă o secvență de caractere, putem parcurge această secvență folosind o buclă for. De exemplu, să calculăm de câte ori apare litera l într-un șir:

#include <iostream>
#include <string>
 
int main()
{
    unsigned count{};   // contor pentru numărul de apariții ale caracterului
    std::string message{ "Hello World"};
    for(const char c: message)
    {
        if(c == 'l')
        {
            count++;
        }
    }
    std::cout << "Count: " << count << std::endl;   // Count: 3
}

Citirea unui șir de la consolă

Pentru a citi un șir introdus de la consolă, la fel ca și alte valori, putem folosi obiectul std::cin:

#include <iostream>
#include <string>
 
int main()
{   
    std::string name;
    std::cout << "Input your name: ";
    std::cin >> name;
    std::cout << "Your name: " << name << std::endl;
}

Ieșire în consolă:

Input your name: Tom  
Your name: Tom

Totuși, dacă șirul introdus conține subșiruri separate prin spațiu, std::cin va folosi doar prima parte:

Input your name: Tom Smith  
Your name: Tom

Pentru a citi întregul șir, se folosește funcția getline():

#include <iostream>
#include <string>
 
int main()
{   
    std::string name;
    std::cout << "Input your name: ";
    getline(std::cin, name);
    std::cout << "Your name: " << name << std::endl;
}

Funcția getline() primește doi parametri – std::cin și variabila în care va fi stocat șirul.

Ieșire în consolă:

Input your name: Tom Smith  
Your name: Tom Smith