2010-11-17 35 views
20

Duplicar posible:
Convert std::string to const char* or char*Cómo convertir std :: string a const char *?

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

que no funciona y me da un error durante la compilación acerca de fundición válido.

¿Hay alguna otra forma de convertir std::string en const char*?

+0

¿Por qué quieres hacer esto? – GManNickG

+1

@GMan: hay muchas razones, la principal es invocar funciones en una API de C? –

+2

@Gman Porque necesito pasar la variable foobar a la función inet_pton de UDT que solo toma las variables de tipo char *. –

Respuesta

10

std::string::c_str() obtiene un puntero const char* a una matriz de caracteres que representa la cadena (terminada en nulo).

No debe manipular los datos a los que apunta este puntero, de modo que si necesita hacerlo, copie los datos.

doble edición - haciéndolo de una manera más C++ moda

Dado que es más agradable para evitar el uso de punteros primas y las matrices siempre que sea posible, también se pueden obtener los datos en una std::vector<char>

#include <string> 
#include <vector> 

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

    // do stuff 
} 

editar esto es más como C, ya que utiliza punteros primas y explícitamente asigna 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

Use 'std :: vector', nunca use' new T [] '. – GManNickG

+0

@GMan - gracias - Siempre adopto por defecto el comportamiento de estilo C cuando una pregunta me pregunta sobre los punteros, aunque en C++, sé que primero debo seguir enseñando con el nivel de C++. – birryree

+0

¿Por qué 'strncpy' y no' strcpy'? – i486

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

Aviso la const. De lo contrario, debe copiarlo en un búfer de caracteres.

4

Vas a obtener un montón de un poco incorrecto respuestas sobre str.c_str() aquí. :) Aunque c_str() es realmente útil, tenga en cuenta que esto en realidad no convertirá la cadena en char*, sino que devolverá el contenido de la cadena como const char*. ¡Y esta es una gran diferencia!

Lo importante aquí es que el puntero que obtienes de c_str() solo es válido siempre que exista el objeto string dado. Por lo que este sería terriblemente mal:

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

así que si quieres convertido, como en: crear un nuevo valor que será independiente del original std::string, entonces usted querrá hacer algo como esto:

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

Pero aún c_str() habrá más que suficiente para que en la mayoría de los casos.Solo trata de pensar en términos del tiempo de vida de los objetos.

+2

Debe ser 'str.length() + 1' porque la longitud no cuenta el byte nulo. – birryree

+2

Use 'std :: vector', nunca use' new T [] '. – GManNickG

+0

@birryree - ¡Eso es! Gracias. – Kos

Cuestiones relacionadas