std::string în C++

Șir de caractere care își gestionează singur memoria; atenție, lucrează cu octeți, nu cu litere.

Sintaxă
#include <string>
std::string s = "text";
std::string s(n, caracter);
s1 + s2, s += t, s == t, s[i]

Ce face std::string

std::string este tipul folosit în C++ pentru text. Spre deosebire de tablourile char[] din C, crește singur când adaugi text, se copiază cu =, se compară cu == și < și se lipește cu + și +=.

Accesul la un caracter se face cu s[i] (fără verificare) sau s.at(i) (cu verificare). Pozițiile încep de la 0. Lungimea se află cu s.size().

Important pentru textele în română: std::string lucrează cu octeți, nu cu litere. În UTF-8, literele ă, â, î, ș, ț au câte 2 octeți, deci "Iași" are size() 5, iar s[2] este doar prima jumătate din „ș”. Pentru afișare și comparații totul funcționează normal; problemele apar când numeri, tai sau inversezi texte cu diacritice.

Exemple

Exemplul 1: Creare, lipire și comparare

#include <iostream>
#include <string>

int main() {
    std::string prenume = "Ana";
    std::string nume = "Popescu";
    std::string complet = prenume + " " + nume;
    complet += " (Iași)";

    std::cout << complet << '\n';
    std::cout << "Primul caracter: " << complet[0] << '\n';
    std::cout << std::boolalpha << "Egal cu \"Ana\": " << (prenume == "Ana") << '\n';
    std::cout << "\"Ana\" < \"Bogdan\": " << (prenume < std::string("Bogdan")) << '\n';
    std::string linie(20, '-');
    std::cout << linie << '\n';
}

Rezultat

Ana Popescu (Iași)
Primul caracter: A
Egal cu "Ana": true
"Ana" < "Bogdan": true
--------------------

Exemplul 2: Diacriticele ocupă câte doi octeți

Parcurgând șirul, vedem octeții: „ș” apare ca două valori, 200 și 153.

#include <iostream>
#include <string>

int main() {
    std::string oras = "Iași";
    std::cout << oras << " are " << oras.size() << " octeți\n";
    for (char c : oras) {
        std::cout << static_cast<int>(static_cast<unsigned char>(c)) << ' ';
    }
    std::cout << '\n';
    std::cout << "\"mama\": " << std::string("mama").size() << " octeți, \"mămică\": "
              << std::string("mămică").size() << " octeți\n";
}

Rezultat

Iași are 5 octeți
73 97 200 153 105 
"mama": 4 octeți, "mămică": 8 octeți

Exemplul 3: Parcurgere și modificare

#include <iostream>
#include <string>

int main() {
    std::string parola = "secret123";
    int cifre = 0;
    for (char c : parola) {
        if (c >= '0' && c <= '9') ++cifre;
    }
    std::cout << "Cifre: " << cifre << '\n';

    for (char& c : parola) {
        c = '*';
    }
    std::cout << "Ascunsă: " << parola << '\n';
}

Rezultat

Cifre: 3
Ascunsă: *********

Greșeli frecvente

  • Numeri literele unui text românesc cu size(): primești numărul de octeți, mai mare decât numărul de litere.
  • Lipești două texte literale cu +: "Ana" + " are" nu compilează (sunt pointeri, nu std::string). Măcar unul dintre operanzi trebuie să fie std::string.
  • Folosești s[i] cu un indice mai mare sau egal cu size(): comportament nedefinit. Folosește s.at(i) când nu ești sigur.

Comenzi înrudite

  • std::string::size: Returnează lungimea șirului în octeți; length() este exact același lucru.
  • std::string::find: Caută un text și returnează poziția primei (find) sau ultimei (rfind) apariții, ori npos.
  • std::string::substr: Returnează o bucată nouă din șir: n caractere începând de la poziția poz.
  • std::string_view: Vedere doar pentru citire asupra unui text existent, fără copiere; se poate micșora la capete.
  • std::getline: Citește un rând întreg, cu spații cu tot, într-un std::string.
  • std::to_string: Transformă un număr în std::string, de exemplu 42 în „42”.