Cum se convertește std::string în const char*? [duplicat] (Programare, C++)

Richard Knop a intrebat.

Posibil duplicat:
Conversia std::string în const char* sau char*

void Foo::bar(const std::string& foobar) {
    // ...
    const char* foobar2 = (char*)foobar;
    // ...
}

Asta nu funcționează și primesc o eroare în timpul compilării cu privire la o distribuție invalidă.

Există o altă modalitate de a converti std::string în const char*?

Comentarii

  • @GMan: există o mulțime de motive, principalul fiind invocarea funcțiilor într-un API C? –  > Por André Caron.
  • @Gman Pentru că trebuie să trec variabila foobar la funcția inet_pton a UDT care acceptă doar variabile de tip char*. –  > Por Richard Knop.
  • @GMan, multe funcții încă necesită (char*), este în mare parte evitabil în C++, dar nu complet. –  > Por Aaron H..
  • @Andre @Aaron: Rareori fac acest lucru. Chiar crezi că un începător știe care este cea mai bună cale de a face ceva? Vrea el de fapt să const char*, , sau o char*? Ar trebui să folosească &foobar[0], , sau un std::vector<char>? Putem răspunde mai bine la această întrebare dacă el întreabă scopul și nu pasul. @Richard: Văd unul care ia un const char* și un void*, , nimic despre a char* nicăieri. Caz în care, după cum se bănuiește, vrei doar a const char* și deci c_str și nu a char*. (@And @Aar: Oh, uite la asta…) –  > Por GManNickG.
  • @GMan: „Sper să nu fiu concediat de la locul de muncă pentru că nu reușesc să scriu codul pe care ar trebui să-l scriu. Aveți vreo idee?”. Întreabă scopul, nu pasul ;-p (Ai dreptate, desigur). –  > Por Steve Jessop.
4 răspunsuri
user500944

Utilizați foobar.c_str().

S-ar putea găsi acest link util: http://www.cppreference.com/wiki/string/start

wkl

std::string::c_str() vă oferă un const char* pointer la un array de caractere care reprezintă șirul de caractere (cu terminație nulă).

Nu trebuie să manipulați datele la care indică acest pointer, așa că, dacă trebuie să faceți acest lucru, copiați datele.

Dublă editare – o facem într-un mod mai apropiat de C++

Deoarece este mai frumos să evitați, pe cât posibil, utilizarea de pointeri și tablouri brute, puteți, de asemenea, să introduceți datele într-un fișier std::vector<char>

#include <string>
#include <vector>

int main()
{
    std::string str = "Hello";
    std::vector<char> cvec(str.begin(), str.end()); 

    // do stuff
}

editare aceasta este mai mult ca în C, deoarece folosește pointeri brute și alocă explicit mem

#include <string>
#include <cstring>

int main()
{
    std::string str = "Hello";
    char *cptr = new char[str.size()+1]; // +1 to account for  byte
    std::strncpy(cptr, str.c_str(), str.size());

    // do stuff...
    delete [] cptr;
}

Comentarii

  • Utilizați std::vector, , nu utilizați niciodată new T[]. –  > Por GManNickG.
  • @GMan – mulțumiri – Întotdeauna am adoptat în mod implicit un comportament foarte asemănător cu cel din C atunci când o întrebare întreabă despre pointeri, deși pe tărâmul C++ știu că ar trebui să mă limitez la predarea mai întâi cu chestii de nivel C++. –  > Por wkl.
  • De ce strncpy și nu strcpy? –  > Por i486.
  • este versiunea sigură a lui strcpy… primește lungimea ca argument, astfel încât să nu depășească indexul maxim al matricei. –  > Por eiran.
Kos

Veți obține o mulțime de cam incorecte răspunsuri despre str.c_str() aici. 🙂 În timp ce c_str() este într-adevăr util, vă rugăm să rețineți că acest lucru nu va fi de fapt converti șirul de caractere într-un char*, , ci mai degrabă va returna conținutul șirului sub forma unui const char*. Și aceasta este o mare diferență!

Ceea ce este important aici este că pointerul pe care îl obțineți de la c_str() este valabil doar atât timp cât valoarea dată de string există. Așadar, aceasta ar fi teribil de greșit:

class Something {
    const char* name;
public:
    Something(const std::string& pname) {
        this->name = pname.c_str(); /* wrong! the pointer will go wrong as the object from the parameter ceases to exist */
    }
};

Așadar, dacă doriți să converti, adică să creați o nouă valoare care va fi independentă de cea originală std::string, , atunci veți dori să faceți ceva de genul următor:

char* convert(const std::string& str) {
    char* result = new char[str.length()+1];
    strcpy(result,str.c_str());
    return result;
}

Dar totuși… c_str() va fi destul de suficient pentru dumneavoastră în majoritatea cazurilor. Încercați doar să vă gândiți în termeni de timp de viață al obiectelor.

Comentarii

  • Ar trebui să fie str.length()+1 deoarece lungimea nu ia în considerare octetul nul. –  > Por wkl.
  • Utilizați std::vector, , nu utilizați niciodată new T[]. –  > Por GManNickG.
  • @birryree – Așa este! Mulțumesc. –  > Por Kos.
  • @Gman – Mai degrabă aș spune „gândește, nu asculta niciodată orbește de proverbe”. 🙂 Ambele au aplicațiile lor. C++ poate fi folosit pentru cod de nivel scăzut și nu este absolut nimic în neregulă cu construcțiile de nivel scăzut. –  > Por Kos.
  • @Kos: Poți să fii cât de poetic vrei, nu există literalmente niciun motiv pentru a folosi new T[] în loc de std::vector<T>, , sau scoped_ptr/unique_ptr<T[]>. Cu excepția cazului în care, bineînțeles, încercați să scrieți cod care nu este sigur împotriva excepțiilor, care își gestionează prost resursele, etc… Doar pentru că C++ poate fi de nivel scăzut, nu înseamnă că puteți, trebuie sau veți scăpa cu ușurință dacă scrieți cod prost. –  > Por GManNickG.
fabrizioM
const char* foobar2 = foobar.c_str();

Observați că const.altfel trebuie să o copiați într-un buffer char.

Tags: