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

Obținerea unui subșir și verificarea începutului și sfârșitului unui șir

Obținerea unui subșir

Funcția substr() obține un subșir. Această funcție acceptă doi parametri. Primul parametru reprezintă indexul de la care începe subșirul. Al doilea parametru este numărul de caractere extrase în subșir. Rezultatul funcției este șirul extras:

#include <iostream>
#include <string>
 
int main()
{
    std::string message{ "tom@localhost.com"};
    std::string submessage = message.substr(4, 9); // 9 caractere începând cu indexul 4
    std::cout << submessage << std::endl;   // localhost
}

Este posibil ca numărul de caractere extrase să fie mai mare decât numărul disponibil în șir. În acest caz, se extrag toate caracterele rămase:

std::string message{ "tom@localhost.com"};
std::string submessage = message.substr(4, 20); // localhost.com

Altă situație – indexul de început al subșirului este invalid – adică egal sau mai mare decât lungimea șirului:

std::string message{ "tom@localhost.com"};
std::string submessage = message.substr(24, 20); // ! Eroare

În acest caz vom întâlni o excepție std::out_of_range, iar programul se va încheia cu eroare.

Dacă dorim să extragem toate caracterele începând cu un anumit index, putem folosi o altă formă a funcției substr() care primește doar indexul de început:

std::string message{ "tom@localhost.com"};
std::string submessage = message.substr(4); // localhost.com

Verificarea începutului și sfârșitului unui șir

Uneori este necesar să verificăm dacă un șir începe cu un anumit subșir. În principiu, pentru acest scop putem folosi funcțiile discutate anterior compare() și substr(). De exemplu:

#include <iostream>
#include <string>
 
int main()
{
    std::string text {"hello world!"};
    std::string hello {"hello"};
 
    // verificare dacă text începe cu șirul hello
    // cu ajutorul funcției compare
    if (text.compare(0, hello.length(), hello) == 0)
    {
        std::cout << "The text starts with " << hello << std::endl;
    }
    // cu ajutorul funcției substr
    if (text.substr(0, hello.length()) == hello)
    {
        std::cout << "The text starts with " << hello << std::endl;
    }
}

Totuși, începând cu standardul C++20, putem folosi și funcția starts_with(). Dacă șirul curent începe cu alt șir, funcția returnează true:

#include <iostream>
#include <string>
 
int main()
{
    std::string text {"hello world!"};
    std::string hello {"hello"};
 
    // verificare dacă text începe cu șirul hello
    if (text.starts_with(hello))
    {
        std::cout << "The text starts with " << hello << std::endl;
    }
}

Analog, cu ajutorul funcțiilor compare() și substr(), putem verifica dacă textul se termină cu un anumit subșir. De exemplu:

#include <iostream>
#include <string>
 
int main()
{
    std::string text {"hello world"};
    std::string world {"world"};
 
    // indexul de început al subșirului de la sfârșit
    unsigned end = text.length() - world.length();
    // verificare dacă text se termină cu șirul world
    if (text.compare(end, world.length(), world) == 0)
    {
        std::cout << "The text ends with " << world << std::endl;
    }
    // cu ajutorul funcției substr
    if (text.substr(end, world.length()) == world)
    {
        std::cout << "The text ends with " << world << std::endl;
    }
}

Însă în standardul C++20 a fost adăugată special pentru acest scop funcția ends_with(). Dacă șirul curent se termină cu alt șir, funcția returnează true:

#include <iostream>
#include <string>
 
int main()
{
    std::string text {"hello world"};
    std::string world {"world"};
 
    // verificare dacă text se termină cu șirul world
    if (text.ends_with(world))
    {
        std::cout << "The text ends with " << world << std::endl;
    }
}