В чем разница между char * и const_cast & lt; char * & gt; (string.c_str ())

Я использую внешнюю библиотеку для взаимодействия с udp (OSC) между двумя приложениями.
Для форматирования сообщений, которые будут отправлены, библиотека ожидает символ *, но я получаю строку из пользовательского интерфейса, которую мне нужно преобразовать.

Пока я работал с другими частями моего кода, часть udp была жестко запрограммирована так:

    char* endofMess = "from setEndMess";

и работал нормально. Я подумал, что будет легко заставить его работать с моими строками и написал:

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

но в отличие от первого примера, в котором я получал сообщение в правильном формате, теперь я получаю только бессмысленные символы. Кто-нибудь знает, откуда это может прийти?

Спасибо!

Матье

РЕДАКТИРОВАТЬ: код, который я использую:
Метод отправки сообщения каждый раз, когда 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() );
}

И если мне нужно изменить шаблон OSC, я называю этот:

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
}

4

Решение

Я подозреваю, что char * не записан, он только не const, потому что это устаревший API. Если это так, ваша проблема, вероятно, в том, что std :: string выпала из области видимости или была изменена между точкой, где вы вызываете c_str, и тем, где она используется в кишках API.

3

Другие решения

c_str() только для чтения std::string,

Если вы хотите записать строку через указатели, используйте либо …

  1. массив (или вектор) char вместо std::string
  2. char* buf = &str[0]; — указывать непосредственно на первый символ строки

Trick (2) гарантированно работает под C ++ 11; на практике это работает и в C ++ 03, но это зависит от реализации компилятора std::string сохраняя хранение.

(И что бы вы ни делали, следите за длиной буфера.)

3

Если вы хотите изменить std::string содержание, я думаю, вы должны использовать &s[0] (убедившись, что строка достаточно большая).

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

например (протестировано с 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;
}

Выход:

abcdef
xxxdef
0