char *和const_cast <char *>(string.c_str())</char *>之间的区别是什么

时间:2012-11-18 10:36:34

标签: c++ char const-cast osc

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

3 个答案:

答案 0 :(得分:3)

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

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

  1. char而非std::string
  2. 的数组(或向量)
  3. char* buf = &str[0]; - 直接指向字符串的第一个字符
  4. 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