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, iarparată 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.