2010-11-17 19 views
20

Eventuali duplicati:
Convert std::string to const char* or char*Come convertire std :: string in const char *?

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

che non funziona e si ottiene un errore durante la compilazione del casting non valido.

C'è un altro modo per convertire std::string in const char*?

+0

Perché vuoi farlo? – GManNickG

+1

@GMan: ci sono molti motivi, il principale che sta invocando funzioni in un'API C? –

+2

@Gman Perché ho bisogno di passare la variabile foobar alla funzione inet_pton di UDT che accetta solo variabili di tipo char *. –

risposta

10

std::string::c_str() ottiene un puntatore const char* in una matrice di caratteri che rappresenta la stringa (terminata da null).

Non si devono manipolare i dati a cui punta questo puntatore, quindi se è necessario farlo, copiare i dati.

Doppia modifica - farlo in maniera più C++ moda

Dal momento che è più bello di evitare l'uso di puntatori prime e array, ove possibile, è anche possibile ottenere i dati in un std::vector<char>

#include <string> 
#include <vector> 

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

    // do stuff 
} 

modificare questo è più come C in quanto utilizza i puntatori prime ed esplicitamente assegna mem

#include <string> 
#include <cstring> 

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

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

Usa 'std :: vector', non usare mai' new T [] '. – GManNickG

+0

@GMan - grazie - Ho sempre il comportamento predefinito in stile C quando una domanda chiede dei puntatori, anche se in terra C++ so che dovrei attenermi all'insegnamento con le cose a livello di C++. – birryree

+0

Perché 'strncpy' e non' strcpy'? – i486

3
const char* foobar2 = foobar.c_str(); 

Avviso del const. Altrimenti è necessario copiarlo in un buffer di caricamento.

4

Stai per ottenere un sacco di kinda errato risposte su str.c_str() qui. :) Mentre c_str() è davvero utile, si prega di tenere presente che questo non sarà in realtà convertire la stringa in char*, ma piuttosto restituire il contenuto della stringa come const char*. E questa è una grande differenza!

Ciò che è importante qui è che il puntatore che si ottiene da c_str() è valido solo finché esiste l'oggetto string specificato. Quindi questo sarebbe terribilmente sbagliato:

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 */ 
    } 
}; 

Quindi, se si vuole convertito, come in: creare un nuovo valore che sarà indipendente dall'originale std::string, quindi ti consigliamo di fare qualcosa di simile questo:

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

Ma ancora c_str() sarà abbastanza per voi, nella maggior parte dei casi.Basta provare a pensare in termini di tempo di vita degli oggetti.

+2

Dovrebbe essere 'str.length() + 1' perché la lunghezza non conta il byte null. – birryree

+2

Usa 'std :: vector', non usare mai' new T [] '. – GManNickG

+0

@birryree - Esatto! Grazie. – Kos

Problemi correlati