Tengo una función en una biblioteca de terceros escrita en C: char* fix_filename_slashes(char* path)
. Esta función espera que se le pase un C-string mutable para que pueda cambiar todas las barras en el camino al uso correcto basado en el sistema operativo. Todas las cadenas que estoy usando en mi Fachada están declaradas como std::string
s. Me trató de utilizar simplemente foo.c_str()
como cualquier otra función que espera una cadena C no cambiarlo y espera una const char *
, pero esta función provoca un error: Error: Argument of type "const char *" is incompatible with parameter of type "char *"
C++: ¿Implementación correcta para pasar una cadena std :: a una función C que quiere cambiar la cadena?
Es el resultado que se me ocurrió:
char* tempf = const_cast<char*>(filename.c_str());
filename = std::string(fix_filename_slashes(tempf));
tempf = NULL;
considerado "correcto" o hay otras formas (¿más correctas?) Para realizar la tarea.
EDITAR
Whups. Aparentemente, la función devuelve una COPIA de la cadena. Todavía hay algunas buenas respuestas ya dadas.
tiene un comportamiento indefinido escrito por todas partes –
@Gene Bushuyev: ¿Podría explicar el UB, así que sé lo que está mal? – Casey
21.3.6 ... const charT * c_str() const; ...."El programa no debe alterar ninguno de los valores almacenados en la matriz" – fizzer