Я использую внешнюю библиотеку для взаимодействия с 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
}
Я подозреваю, что char * не записан, он только не const, потому что это устаревший API. Если это так, ваша проблема, вероятно, в том, что std :: string выпала из области видимости или была изменена между точкой, где вы вызываете c_str, и тем, где она используется в кишках API.
c_str()
только для чтения std::string
,
Если вы хотите записать строку через указатели, используйте либо …
char
вместо std::string
char* buf = &str[0];
— указывать непосредственно на первый символ строкиTrick (2) гарантированно работает под C ++ 11; на практике это работает и в C ++ 03, но это зависит от реализации компилятора std::string
сохраняя хранение.
(И что бы вы ни делали, следите за длиной буфера.)
Если вы хотите изменить 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