c_str array c++ string char const

c++ - array - string to char[]



¿Cómo puedo convertir const char*en string y luego volver a char* (4)

Cambia la declaración de tu función de

char* getHyphen(const char* input)

a

auto hyphenated( string const& input ) -> string

y evite todos los problemas de conversión a char const* y viceversa.

Dicho esto, puedes construir una std::string desde un char_const* siguiente manera:

string( "Blah" )

y recuperas una char const* temporal usando el método c_str .

Tenga en cuenta que el resultado de c_str solo es válido mientras exista la instancia de string original y no se modifique. Por ejemplo, aplicar c_str a una string local y devolver ese resultado, produce un comportamiento indefinido y no es una buena idea. Si absolutamente debe devolver un char* o char const* , asigne una matriz con new y copie los datos de cadena con strcpy , como este: return strcpy( new char[s.length()+1], s.c_str() ) , donde +1 es para acomodar un byte cero de terminación.

Estoy comenzando c ++ y tengo dificultades para entender const char* . Estoy intentando convertir la entrada en el método en string , y luego cambiar las cadenas para agregar guiones donde quiero y finalmente tomar esa cadena y convertirla de nuevo a char* para regresar. Hasta ahora, cuando intento esto, me da un error de bus 10.

char* getHyphen(const char* input){ string vowels [12] = {"A","E","I","O","U","Y","a","e","i","o","u","y"}; //convert char* to string string a; int i = 0; while(input != ''/0''){ a += input[i]; input++; i++; } //convert string to char* return NULL; }


En primer lugar, no necesita todo ese código para construir una std::string desde la entrada. Puedes simplemente usar:

string a(input);

En cuanto a devolver un nuevo char* , puede usar:

return strdup(a.c_str()); // strdup is a non-standard function but it // can be easily implemented if necessary.

Asegúrese de desasignar el valor devuelto.

Será mejor simplemente devolver una std::string para que los usuarios de su función no tengan que preocuparse por la asignación / desasignación de memoria.

std::string getHyphen(const char* input){


No use char* . Use std::string , como todos los demás aquí le están diciendo. Esto eliminará todos esos problemas.

Sin embargo, para completar y porque quiere entender el trasfondo, analicemos lo que está sucediendo.

while(input != ''/0''){

Probablemente quieras decir:

while(*input != ''/0'') {

El código compara el puntero de input a /0 , es decir, busca un puntero nulo, que se debe a la desafortunada conversión automática de un carácter /0 . Si intentara comparar con, digamos, ''x'' o ''a'' , entonces obtendría un error de compilación en lugar de bloqueos en tiempo de ejecución.

Desea desreferenciar el puntero a través de la *input para ir al punto señalado.

a += input[i]; input++; i++;

Esto tampoco funcionará. Incrementa el puntero de input , pero con [i] avanza aún más . Por ejemplo, si la input se ha incrementado tres veces, entonces la input[3] será el séptimo carácter de la matriz original pasada a la función, no la cuarta. Esto finalmente da como resultado un comportamiento indefinido cuando sales de los límites de la matriz. El comportamiento indefinido también puede ser el "error de autobús 10" que mencionas.

Reemplazar con:

a += *input; input++; i++;

(En realidad, ahora que ya no se usa, puedes eliminarlo por completo).

Y déjame repetirlo una vez más: No uses char* . Use std::string .


R: La clase std::string tiene un constructor que toma una char const* , por lo que simplemente crea una instancia para hacer su conversión.

B: Las instancias de std::string tienen una función de miembro c_str() que devuelve una char const* que puede usar para convertir de nuevo a char const* .

auto my_cstr = "Hello"; // A std::string s(my_cstr); // A // ... modify ''s'' ... auto back_to_cstr = s.c_str(); // B