5

我使用外部库来处理 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    
}
4

3 回答 3

4

c_str()用于 的只读访问std::string

如果要通过指针写入字符串,请使用...

  1. 一个数组(或向量)char而不是std::string
  2. char* buf = &str[0];- 直接指向字符串的第一个字符

Trick (2) 保证在 C++11 下工作;实际上,它也可以在 C++03 中使用,但这依赖于std::string具有连续存储的编译器实现。

(无论你做什么,都要注意缓冲区的长度。)

于 2012-11-18T10:44:48.733 回答
3

我怀疑 char* 没有被写入,它只是非常量,因为它是一个遗留 API。如果是这样,您的问题可能是 std::string 超出范围或在您调用 c_str 和它在 API 内部使用的位置之间被修改。

于 2012-11-18T11:04:09.730 回答
1

如果你想修改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
于 2012-11-18T10:42:18.583 回答