Ce face std::string::substr
s.substr(poz, n) creează un șir nou cu cel mult n caractere luate de la poz. Fără n, ia tot restul. Șirul original nu se schimbă.
Dacă n trece de final, se ia doar cât există. Dacă poz este mai mare decât size(), se aruncă std::out_of_range. Pentru că se copiază textul, pentru bucăți doar citite poți folosi std::string_view::substr, care nu copiază.
Parametri
| Parametru | Descriere |
|---|---|
poz |
Poziția primului caracter. |
n |
Lungimea maximă a bucății; implicit până la final. |
Ce returnează
Un std::string nou.
Exemple
Exemplul 1: Părți dintr-o dată
#include <iostream>
#include <string>
int main() {
std::string data = "2026-10-19";
std::string an = data.substr(0, 4);
std::string luna = data.substr(5, 2);
std::string zi = data.substr(8);
std::cout << zi << "." << luna << "." << an << '\n';
}
Rezultat
19.10.2026
Exemplul 2: Domeniul unei adrese de e-mail
#include <iostream>
#include <string>
int main() {
std::string email = "ana.popescu@dexblog.ro";
std::size_t aron = email.find('@');
std::cout << "Utilizator: " << email.substr(0, aron) << '\n';
std::cout << "Domeniu: " << email.substr(aron + 1) << '\n';
}
Rezultat
Utilizator: ana.popescu
Domeniu: dexblog.ro
Exemplul 3: Poziție invalidă
#include <iostream>
#include <stdexcept>
#include <string>
int main() {
std::string s = "Cluj";
std::cout << "[" << s.substr(2, 100) << "]\n"; // n prea mare: se ia restul
try {
std::cout << s.substr(10) << '\n';
} catch (const std::out_of_range&) {
std::cout << "Poziția 10 nu există în \"" << s << "\"\n";
}
}
Rezultat
[uj]
Poziția 10 nu există în "Cluj"
Greșeli frecvente
- Crezi că al doilea parametru este poziția de final, ca în Java sau JavaScript. Este lungimea:
s.substr(2, 3)ia 3 caractere de la poziția 2. - Tai un text cu diacritice la o poziție calculată în litere: poți rupe o literă în două și obții UTF-8 invalid.
Comenzi înrudite
std::string::find: Caută un text și returnează poziția primei (find) sau ultimei (rfind) apariții, ori npos.std::string_view: Vedere doar pentru citire asupra unui text existent, fără copiere; se poate micșora la capete.std::string::erase: Șterge o porțiune din șir, dată prin poziția de început și numărul de caractere.std::string::copy: Copiază cel mult n caractere din șir într-un tablou de char, fără să adauge \0.