【问题标题】:What's the difference between char * and const_cast<char*>(string.c_str())char * 和 const_cast<char*>(string.c_str()) 有什么区别
【发布时间】:2012-11-18 10:36:34
【问题描述】:

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

【问题讨论】:

  • 目前尚不清楚您是要尝试将内容保存到 char* 还是将其传递给网络函数以便在线发送。
  • 这是在函数中更改一个变量,该变量将说明消息的格式例如:将消息从“/firstOSCpattern/x”更改为“/secondOSCpattern/x”
  • 通过编辑为您的问题添加更多信息(标签下方有一个链接)。 cmets中的代码不要过去,格式化是不可能的。
  • @Mat,我刚刚想通了! :) 问题是 Yakk 指出的!非常感谢你们每一个人,我真的很感谢你们的帮助,我有点绝望!

标签: c++ char const-cast osc


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      如果你想修改std::string的内容,我认为你应该使用&amp;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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-03
        • 2020-06-26
        • 2010-12-14
        • 2012-08-14
        • 2010-10-27
        • 2014-03-21
        相关资源
        最近更新 更多