我使用外部库来处理2个应用程序之间的udp(OSC)通信。 要格式化将要发送的消息,库需要一个char *但是我从UI中获取了一个我必须转换的字符串。
当我处理代码的其他部分时,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
}
答案 0 :(得分:3)
c_str()
用于std::string
的只读访问。
如果要通过指针写入字符串,请使用...
char
而非std::string
char* buf = &str[0];
- 直接指向字符串的第一个字符 Trick(2)保证在C ++ 11下工作;实际上它也适用于C ++ 03,但它依赖于具有contignuos存储的std::string
的编译器实现。
(无论你做什么,都要留意缓冲区长度。)
答案 1 :(得分:3)
我怀疑char *没有被写入,它只是非const,因为它是一个遗留API。如果是这样,你的问题可能是std :: string已经超出了范围,或者在你调用c_str的地方和在API的内部使用它之间被修改了。
答案 2 :(得分:0)
如果您想修改std::string
内容,我认为您应该使用&s[0]
(确保字符串足够大)。
std::string s = "abcdef...";
char* ptr = &s[0];
e.g。 (用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