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, nustd::string). Măcar unul dintre operanzi trebuie să fiestd::string. - Folosești
s[i]cu un indice mai mare sau egal cusize(): comportament nedefinit. Foloseștes.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”.