Mai mult
std::string la char*
Vreau pentru a converti un std::string intr-o **char* sau char[]** tip de date.
std::string str = "string";
char* chr = str;
Rezultate din: "eroare: nu se poate converti 'std::string' la 'char' ...".
Ce metode sunt disponibile pentru a face acest lucru?
303
16
Nu o't converti automat (multumesc lui dumnezeu). Te'll trebuie să utilizeze metoda
c_str()
pentru a obține C string versiune.Rețineți că, se întoarce o
const char *
; nu't permis să schimbe C-stil șirul returnat dec_str()
. Dacă doriți să proces te'll trebuie să-l copiați în primul rând:Sau în modern C++:
Detalii aici, și aici dar puteți folosi
Dacă am'd nevoie de un mutabil prime copie a unui c++'s string conținutul, apoi m-am'd a face acest lucru:
și mai târziu:
Deci, de ce nu't am juca cu std::vector sau nou[] ca oricine altcineva? Pentru că atunci când am nevoie de un mutabil C-stil raw char* șir, apoi, pentru că vreau să sun C cod care se schimbă șirul și C cod deallocates chestia cu free() și alocă cu malloc() (strdup folosește malloc). Deci, dacă am trece mele șir prime pentru o funcție X scris în C l ar putea o constrângere pe l's argument că trebuie să alocat pe heap (de exemplu, dacă funcția ar putea dori pentru a apela realloc pe parametru). Dar este foarte puțin probabil că va aștepta un argument alocate cu (unele de utilizator redefinit) nou[]!
(Acest răspuns se aplică la C++98 numai.)
Te rog, nu't folosi o prime
char*
.const char* ca = str.c_str();
char* ca = new char[str.size()+1]; std::copy(str.begin(), str.end(), ca); ca[str.dimensiune()] = '\0';
Don't uitați să
delete[]
de ea mai târziu.size_t const MAX = 80; // numărul maxim de caractere char ca[MAX] = {}; std::copy(str.begin(), (str.size() >= MAX ? str.begin() + MAX : str.end()), ca);
std::string
nu't, implicit, de a converti la aceste tipuri pentru simplul motiv că au nevoie pentru a face acest lucru este de obicei un design miros. Asigurați-vă că really nevoie de ea.Dacă tu siguranță nevoie de un
char*
, la best mod este, probabil:Acest lucru ar fi mai bine ca un comentariu pe bobobobo's a răspuns, dar eu nu't au rep pentru asta. Se realizează același lucru dar cu mai bune destinații de plasare.
Deși alte răspunsuri sunt utile, dacă aveți vreodată nevoie pentru a converti
std::string " la " char*
în mod explicit, fără const,const_cast
este prietenul tău.Rețineți că acest lucru va nu da o copie a datelor; aceasta vă va da un pointer la șir de caractere. Astfel, dacă modificați un element de
chr
, ai'll modificastr
.Presupunând că ai nevoie doar de un C-style șir să treacă drept de intrare:
Să fie strict pedant, nu "a converti un std::string într-un char* sau char[] tip de date."
Ca alte răspunsuri au arătat, puteți copia conținutul std::string pentru a o matrice char, sau de a face o const char* conținutul de std::string, astfel încât să puteți accesa într-un "stilul C".
Daca're încercarea de a schimba conținutul std::string, std::string tip de metode pentru a face ceva ce ai putea avea nevoie pentru a face pentru ea.
Daca're încercarea de a trece de la o funcție care ia un char*, nu's std::string::c_str().
Pentru completitudine' dumnezeu, don't uita
std::string::copy()
.std::string::copy()
nu't NUL termina. Dacă aveți nevoie pentru a asigura un terminator NUL pentru utilizarea în șir C funcții:Aici este unul mai robust versiune de Protocol Tampon`
Puteți face aceasta folosind iterator.
Noroc.
Alternativ , puteți folosi vectori pentru a obține o scriere char* cum s-a demonstrat de mai jos;
Conversie în stil OOP
convertor.che
converter.cpp
utilizare
Acest lucru va lucra, de asemenea,
O versiune sigura de orlp's char* răspunde folosind unique_ptr: