字符 * 和 const_cast<字符*>(string.c_str())有什么区别
What's the difference between char * and const_cast<char*>(string.c_str())
我使用外部库来处理 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
的只读访问。
如果要通过指针写入字符串,请使用...
char
数组(或向量)而不是std::string
-
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
相关文章:
- C++字符*缓冲区的大小
- HEX值到wchar_t字符(UTF-8)的转换
- 为什么 Serial.println(<char[]>);返回随机字符?
- 我的字符计数代码计算错误.为什么
- 字符串-C++后显示的随机字符
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 我可以得到一个字符 * 到一个 std::sregex_iterator 匹配 str() 吗?
- 在函数内部传递字符 *str
- 为什么在使用字符指针 str1 而不是 str 时会出现分段转储?
- 为什么不能在常量字符 * str 上应用 str.find_last_of( )
- 将 str 转换为字符*问题
- 字符 *str;str= "HELLO" ;如何在不为字符串分配任何内存的情况下工作?
- 将字符串转换为无符号字符 str
- (无符号字符)str 与 str + 0xff 或(无符号整数)值与值 + 0xffff 中的哪一种更快和首选
- 为什么你需要在新字符(str.length())上添加一个
- C++使用find(str,index)计算字符串中字符的出现次数
- 用字符而不是字节进行子str
- "str" 和常量字符之间的 c++ 重载[N]?
- 字符* str= "ab" , str 和 &str 的混淆
- 为什么我不能在 C++ 中使用 str.erase(str.begin() + index) 擦除字符串中的字符?