std::string::replace în C++

Înlocuiește porțiunea de n caractere de la poziția poz cu alt text.

Sintaxă
std::string& replace(std::size_t poz, std::size_t n, const std::string& text_nou);

Ce face std::string::replace

s.replace(poz, n, nou) șterge n caractere de la poz și pune în locul lor nou, care poate avea altă lungime. Atenție: nu caută un text după conținut, ca în alte limbaje, ci lucrează cu poziții.

Pentru „înlocuiește toate aparițiile lui X cu Y” combini find și replace într-o buclă (exemplul 2) sau folosești std::regex_replace.

Parametri

Parametru Descriere
poz Poziția de început a porțiunii înlocuite.
n Lungimea porțiunii înlocuite.
text_nou Textul care intră în loc.

Ce returnează

Referință la șirul modificat.

Exemple

Exemplul 1: Înlocuirea primei apariții

#include <iostream>
#include <string>

int main() {
    std::string s = "Ana are mere.";
    std::string cauta = "mere";
    std::size_t poz = s.find(cauta);
    if (poz != std::string::npos) {
        s.replace(poz, cauta.size(), "pere și prune");
    }
    std::cout << s << '\n';
}

Rezultat

Ana are pere și prune.

Exemplul 2: Înlocuirea tuturor aparițiilor

După fiecare înlocuire continuăm căutarea după textul nou, ca să nu-l înlocuim din nou.

#include <iostream>
#include <string>

std::string inlocuieste_tot(std::string s, const std::string& vechi, const std::string& nou) {
    std::size_t poz = 0;
    while ((poz = s.find(vechi, poz)) != std::string::npos) {
        s.replace(poz, vechi.size(), nou);
        poz += nou.size();
    }
    return s;
}

int main() {
    std::cout << inlocuieste_tot("1.299.000 lei", ".", " ") << '\n';
    std::cout << inlocuieste_tot("ab ab ab", "ab", "abc") << '\n';
}

Rezultat

1 299 000 lei
abc abc abc

Greșeli frecvente

  • Scrii s.replace("vechi", "nou") ca în Python sau JavaScript: nu există așa ceva. replace primește poziție și lungime.
  • În bucla de înlocuire nu avansezi poziția după textul nou: dacă textul nou îl conține pe cel vechi, bucla nu se termină.

Comenzi înrudite

  • std::string::find: Caută un text și returnează poziția primei (find) sau ultimei (rfind) apariții, ori npos.
  • std::string::erase: Șterge o porțiune din șir, dată prin poziția de început și numărul de caractere.
  • std::string::insert: Inserează text la o anumită poziție în șir, mutând restul spre dreapta.
  • std::regex_replace: Înlocuiește toate potrivirile unei expresii regulate cu alt text, care poate folosi grupurile $1, $2.