2010-04-25 23 views
10

Tengo un C++ string. Necesito pasar esta cadena a una función que acepta un parámetro char* (por ejemplo, strchr()).Cómo convertir un puntero char * en una cadena C++?

a) ¿Cómo obtengo ese puntero?

b) ¿Existe alguna función equivalente a strschr() que funcione para C++ strings?

Respuesta

20
  1. Para obtener el C cadena equivalente de la C++string uso objeto de la función c_str .
  2. Para localizar la primera ocurrencia de un char en un string uso objeto de la función find_first_of.

Ejemplo:

string s = "abc"; 

// call to strlen expects char * 
cout<<strlen(s.c_str()); // prints 3 

// on failure find_first_of return string::npos 
if(s.find_first_of('a') != string::npos) 
    cout<<s<<" has an a"<<endl; 
else 
    cout<<s<<" has no a"<<endl; 

Nota: Me di la strlen sólo un ejemplo de una función que toma char*.

+0

@unicornaddict: gracias. ahora, ¿cómo puedo encontrar las otras apariciones de ese personaje en la cadena? [la longitud de la cadena es enorme, por lo que crear una nueva cadena no es una opción] – Moeb

+1

@cambr: Hay una versión ** sobrecargada ** de 'find_first_of' que acepta la posición ** para iniciar la búsqueda ** como un argumento He publicado un ejemplo aquí: http://www.ideone.com/bESwL – codaddict

0

Si str en su cadena use el método str.c_str() para obtener el char * dentro de él.

+3

¿Estás seguro de que es 'c_tsr' y no' c_str'? No soy un experto en C++ pero busqué en Google 'c_tsr' y me corrigieron a' c_str'. –

+0

mi mal - arreglaré eso –

6

Sorprendentemente, std:; string tiene muchísimas más capacidades que las cadenas estilo C. Probablemente desee el método find_first_of(). En general, si te encuentras usando las funciones strxxx() en C++ std :: strings, seguramente estás haciendo algo mal.

Como gran parte de la biblioteca estándar de C++, la clase de cuerda es una bestia compleja. Para aprovecharlo al máximo, realmente necesita un buen libro de referencia. Recomiendo The C++ Standard Library, por Nicolai Josuttis.

0

Si lo que desea asignar una cadena literal a PW, puede hacerlo como

char *pw = "Hello world"; 

Si usted tiene un objeto std :: string C++, el valor de la que desea asignar a PW, puede hacerlo como

char *pw = some_string.c_str()

Sin embargo, el valor que pw puntos a sólo serán válidos para el tiempo de vida de some_string.

Más aquí:
How to assign a string to char *pw in c++

Goodluck !!

+1

Incorrecto. c_str() devuelve un const char * –

+0

Esta no es una muy buena idea. No hay garantía de que pw apunte a los mismos datos en un momento posterior, incluso si some_string aún persiste. Es mucho más seguro llamar a c_str() para cada función que necesita para pasar un char *. –

4

No se puede obtener una char* de un string

string no le permitirá el acceso gratuito a su buffer interno. Lo más cercano que puede obtener es const char* usando .c_str() si lo quiere nulo terminado o .data() si no tiene que ser terminado nulo.

A continuación, puede convertir el puntero devuelto por estas funciones a char*, pero lo hace bajo su responsabilidad. Dicho esto, este es un lanzamiento relativamente seguro, siempre y cuando te asegures de no estar cambiando la cuerda. Si lo cambió, el puntero que obtuvo de c_str() puede que ya no sea válido.

este código:

string str("Hello World!"); 
char* sp = (char*)str.c_str(); 
sp[5] = 'K'; 

es probablemente correcto
Sin embargo esto:

string str("Hello World!"); 
char* sp = (char*)str.c_str(); 
str = "Chaged string"; 
sp[5] = 'K'; 

definitivamente no es aceptable.

+2

No está bien definido. –

+0

+1 por ser la respuesta a la pregunta _I_ estaba buscando :) –

+0

Más discusión aquí: http://bytes.com/topic/c/answers/544209-std-string-c_str-const_cast-char –

0
std::string yourString("just an example"); 
char* charPtr = new char[yourString.size()+1]; 
strcpy(charPtr, yourString.c_str()); 
+0

Copiar a través de un puntero no inicializado rara vez es una buena idea. –

+0

@Neil: es un ejemplo, por Dios ... pero lo he editado para su placer ;-) – JRL

+0

Puede evitar la gestión manual de la memoria haciendo 'std :: vector charBuf (yourString.begin(), yourString.end()); charBuf.push_back ('\ 0'); '- esto le permitirá usar' & charBuf [0] 'para obtener un' char * '. –

0

Tal vez esto le ayudará a exmaple

#include <iostream> 
#include <string> 
using namespace std; 

int main() 
{ 
    string str ("Replace the vowels in this sentence by asterisks."); 
    size_t found; 

    found=str.find_first_of("aeiou"); 
    while (found!=string::npos) 
    { 
    str[found]='*'; 
    found=str.find_first_of("aeiou",found+1); 
    } 

    cout << str << endl; 

    return 0; 
} 
0

El estándar de C++ proporciona dos funciones miembro de std :: Claass basic_string que devuelven puntero al primer elemento de la cadena. Son c_str() y data(). Pero ambos devuelven const char *, por lo que no puede usarlos con una función que tenga un parámetro de tipo char *.

En cuanto a la función strchr, su primer parámetro es const char *. Entonces puede usar c_str() y data() con esta función. Sin embargo, es mucho mejor usar la función de miembro find() de la clase sttd :: basic_string en lugar de strchr.

Cuestiones relacionadas