std::string::copy în C++

Copiază cel mult n caractere din șir într-un tablou de char, fără să adauge \0.

Sintaxă
std::size_t copy(char* destinatie, std::size_t n, std::size_t poz = 0) const;

Ce face std::string::copy

s.copy(buf, n, poz) copiază în tabloul buf cel mult n caractere, începând de la poziția poz. Returnează câte caractere a copiat efectiv.

Nu pune '\0' la final, așa că, dacă vrei să folosești buf ca șir C, adaugi tu terminatorul la poziția returnată. Nu confunda cu copierea unui șir întreg, care se face simplu cu =.

Parametri

Parametru Descriere
destinatie Tabloul de char în care se copiază; trebuie să aibă loc pentru n caractere.
n Numărul maxim de caractere copiate.
poz Poziția de început în șir.

Ce returnează

Numărul de caractere copiate.

Exemple

Exemplul 1: Copierea într-un tablou de lungime fixă

#include <cstdio>
#include <string>

int main() {
    std::string nume = "Popescu Ana Maria";
    char scurt[8];
    std::size_t copiate = nume.copy(scurt, sizeof(scurt) - 1);   // lăsăm loc pentru '\0'
    scurt[copiate] = '\0';
    std::printf("[%s] (%zu caractere)\n", scurt, copiate);

    char prenume[4];
    copiate = nume.copy(prenume, 3, 8);
    prenume[copiate] = '\0';
    std::printf("[%s]\n", prenume);
}

Rezultat

[Popescu] (7 caractere)
[Ana]

Greșeli frecvente

  • Uiți '\0' după copy și afișezi tabloul cu printf("%s"): se citesc octeți străini până la primul zero întâlnit.
  • Dai un n mai mare decât tabloul destinație: scrii în afara lui (comportament nedefinit).

Comenzi înrudite

  • std::string::c_str: Dă un pointer la textul șirului, terminat cu \0, pentru funcțiile care cer char* (stil C).
  • std::strcpy: Copiază (strcpy, strncpy) sau lipește (strcat) șiruri C în tablouri de char.
  • std::memcpy: Copiază n octeți dintr-o zonă de memorie în alta; memmove permite zone suprapuse.
  • std::string::substr: Returnează o bucată nouă din șir: n caractere începând de la poziția poz.