char* 和 const_cast<char*>(string.c_str()) 有什么区别?

5
我将使用外部库来处理两个应用程序之间的UDP(OSC)通信,这与IT技术有关。为了格式化将要发送的消息,该库需要一个char*,但我从UI获得一个字符串必须进行转换。
在处理我的代码的其他部分时,udp部分是硬编码的,例如:
    char* endofMess = "from setEndMess"; 

一直以来它都很好用。我认为很容易通过我的字符串让它工作,并写下了:

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

但是,与我第一个示例不同的是,我接收到的信息格式正确,但现在我只收到了无意义的字符。有人知道这可能是从哪里来的吗?

谢谢!

Matthieu

编辑:我使用的代码: 每次 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    
}

1
不清楚你是想将东西保存到那个 char* 中,还是将其传递给网络函数以便在网络上传输。 - Mat
需要更改函数中的变量,以指定消息的格式。例如,将消息从“/firstOSCpattern/ x”更改为“/secondOSCpattern/ x”。 - err0r_500
通过编辑问题添加更多信息(标签下方有链接)。不要在评论中粘贴代码,这是不可能格式化的。 - Mat
@Mat,我终于搞定了! :) 问题就是Yakk指出的那个!非常感谢你们每一个人的帮助,我真的很感激,我有点绝望了! - err0r_500
3个回答

4

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

如果您想通过指针写入字符串,则可以使用以下方法之一...

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

技巧 (2) 在 C++11 中保证可用;在实践中,它也适用于 C++03,但这依赖于编译器对 std::string 具有连续存储的实现。

(无论您做什么,请注意缓冲区长度。)


3

我猜测 char* 并没有被写入,只是因为它是一个传统 API 所以不是常量。如果是这样的话,你的问题可能是 std::string 在你调用 c_str 和在 API 内部使用它之间已经失效或被修改了。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接