字符 * 和 const_cast<字符*>(string.c_str())有什么区别

What's the difference between char * and const_cast<char*>(string.c_str())

本文关键字:字符 str 什么 区别 string lt const gt cast      更新时间:2023-10-16

我使用外部库来处理 2 个应用程序之间的 udp (OSC) 通信。为了格式化将发送的消息,库需要一个字符*,但我从 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',''};
//endofMess = s; //gibberish    
}
c_str()用于

std::string的只读访问。

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

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

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

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

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

如果你想修改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