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 ...
- una matriz (o vector) de
char
lugar destd::string
-
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).