sirve que para funcion ejemplos c_str c++ char const-cast osc

c++ - que - ¿Cuál es la diferencia entre char*y const_cast<char*>(string.c_str())



string c++ (3)

Si quiere modificar el contenido de std::string , creo que debería usar &s[0] (asegurándose de que la cadena sea lo suficientemente grande).

std::string s = "abcdef..."; char* ptr = &s[0];

ej. (probado con MSVC10):

#include <iostream> #include <ostream> #include <string> using namespace std; void f(char* ptr, size_t count) { for (size_t i = 0; i < count; i++) ptr[i] = ''x''; } int main() { string s = "abcdef"; cout << s << endl; f(&s[0], 3); cout << s << endl; }

Salida:

abcdef xxxdef

Utilizo una biblioteca externa para tratar la comunicación udp (OSC) entre 2 aplicaciones. Para formatear los mensajes que se enviarán, la biblioteca espera un char * pero obtengo una cadena de la IU que debo convertir.

Mientras lidiaba con otras partes de mi código, la parte udp estaba codificada de esa manera:

char* endofMess = "from setEndMess";

y estaba funcionando bien. Pensé que sería fácil hacerlo funcionar con mis hilos y escribí:

std::string s = "from setEndMess"; char* endofMess = const_cast<char*>(s.c_str());

pero a diferencia del primer ejemplo en el que recibí el mensaje correctamente formateado, ahora recibo solo caracteres extravagantes. ¿Alguien sabe de dónde puede venir?

¡Gracias!

Matthieu

EDITAR: el código que uso: el método para enviar el mensaje cada vez que cambie OSCVal:

void osc500::testOSC(int identifier, float OSCval) { UdpTransmitSocket transmitSocket( IpEndpointName( destIP, port ) ); char buffer[1024]; osc::OutboundPacketStream p( buffer, 1024 ); p << osc::BeginBundleImmediate << osc::BeginMessage( endofMess ) << OSCval << osc::EndMessage << osc::EndBundle; transmitSocket.Send( p.Data(), p.Size() ); }

Y si tengo que cambiar el patrón OSC, lo llamo:

void osc500::setEndMess(String endpattern){ // endofMess = "from setEndMess"; //OK works fine each time it''s called //1st try : //std::string s = "from setEndMess"; //endofMess = const_cast<char*>(s.c_str()); //gibberish //2nd try : //std::string s = "from setEndMess"; //endofMess = &s[0]; //gibberish //3rd & 4th tries : //char s[4] = {''t'',''e'',''s'',''t''}; //char s[5] = {''t'',''e'',''s'',''t'',''/0''}; //endofMess = s; //gibberish }


Sospecho que el char * no está escrito, es solo no const porque es una API heredada. Si es así, es probable que su problema sea que std :: string ha caído fuera del alcance o se ha modificado entre el punto donde llama a c_str y dónde se usa en las entrañas de la API.


c_str() es para acceso de solo lectura de std::string .

Si desea escribir en una cadena a través de punteros, utilice cualquiera de ...

  1. una matriz (o vector) de char lugar de std::string
  2. char* buf = &str[0]; - señalar directamente al primer personaje de una cadena

Se garantiza que Trick (2) funciona bajo C ++ 11; en la práctica, también funciona en C ++ 03 pero se basa en la implementación del compilador de std::string tiene un almacenamiento continuo.

(Y haga lo que haga, vigile la longitud del búfer).