std::string::substr în C++

Returnează o bucată nouă din șir: n caractere începând de la poziția poz.

Sintaxă
std::string substr(std::size_t poz = 0, std::size_t n = npos) const;

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.