std::string::c_str în C++

Dă un pointer la textul șirului, terminat cu \0, pentru funcțiile care cer char* (stil C).

Sintaxă
const char* c_str() const noexcept;
const char* data() const noexcept;
char* data() noexcept;  // C++17

Ce face std::string::c_str

Multe funcții vechi sau din C (printf, fopen, strlen, funcții ale sistemului de operare) primesc text ca const char*. s.c_str() returnează un astfel de pointer, cu '\0' la final.

data() returnează același pointer; din C++11 este și el terminat cu '\0', iar din C++17 există și varianta ne-const, prin care poți modifica direct caracterele (fără să depășești size()).

Pointerul rămâne valid doar cât timp șirul există și nu este modificat. Orice adăugare poate muta textul în altă zonă de memorie.

Ce returnează

Pointer la primul caracter.

Exemple

Exemplul 1: Folosirea cu funcții C

#include <cstdio>
#include <cstring>
#include <string>

int main() {
    std::string nume = "Ana Popescu";
    std::printf("Nume: %s\n", nume.c_str());
    std::printf("strlen: %zu, size: %zu\n", std::strlen(nume.c_str()), nume.size());
}

Rezultat

Nume: Ana Popescu
strlen: 11, size: 11

Exemplul 2: Modificare prin data()

#include <iostream>
#include <string>

int main() {
    std::string cod = "abc-123";
    char* p = cod.data();
    for (std::size_t i = 0; i < cod.size(); ++i) {
        if (p[i] >= 'a' && p[i] <= 'z') p[i] = static_cast<char>(p[i] - 'a' + 'A');
    }
    std::cout << cod << '\n';
}

Rezultat

ABC-123

Greșeli frecvente

  • Păstrezi pointerul de la c_str() al unui șir temporar: const char* p = obtine_nume().c_str();. Șirul dispare la finalul instrucțiunii, iar p arată spre memorie eliberată.
  • Modifici șirul (de exemplu cu +=) și folosești în continuare un pointer obținut înainte: poate fi invalid.
  • Trimiți c_str() unei funcții C pentru un șir care conține '\0' în interior: funcția vede doar textul până la primul '\0'.

Comenzi înrudite

  • std::string: Șir de caractere care își gestionează singur memoria; atenție, lucrează cu octeți, nu cu litere.
  • std::printf: Afișează text formatat în stil C, cu marcaje precum %d, %s, %.2f.
  • std::strlen: Returnează lungimea unui șir C, numărând octeții până la terminatorul \0.
  • std::string::copy: Copiază cel mult n caractere din șir într-un tablou de char, fără să adauge \0.