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