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;
}
}