我有一个导出char*
的库,我可以在其中生成消息,然后调用send发送消息(通过网络)。如何在代码中向导出的缓冲区写一条非常简单的消息?
我写了四种不同的方法来编写消息,但都不是理想的方法:
class Lib {
char msg[100];
public:
Lib() {
// nullify the buffer
msg[0] = 0;
}
char* get_buffer() {
return msg;
}
void send() {
std::cout << "Message is: " << msg << std::endl;
// nullify the buffer for the next send
msg[0] = 0;
}
};
int main () {
{
Lib lib;
char* buf = lib.get_buffer();
// Method 1 is tedious
buf[0] = 'H';
buf[1] = 'e';
buf[2] = 'l';
buf[3] = 'l';
buf[4] = 'o';
buf[5] = 0;
lib.send();
}
{
Lib lib;
char* buf = lib.get_buffer();
// Method 2 doesn't work
buf = "Hello";
lib.send();
}
{
Lib lib;
char* buf = lib.get_buffer();
// Method 3 involves a copy
string str = "Hello";
str.copy(buf, str.size());
lib.send();
}
{
Lib lib;
char* buf = lib.get_buffer();
// Method 4 involves a copy
char* c_arr = "Hello";
std::memcpy(buf, c_arr, 6);
lib.send();
}
}
输出为:
Message is: Hello
Message is:
Message is: Hello
Message is: Hello
第一种方法对我来说似乎很乏味。第二种方法不起作用,因为buf
然后指向内存中包含“ Hello”的新位置。第三和第四种方法涉及创建临时内存缓冲区和内存副本。
我想要类似于buf = {'H', 'e', 'l', 'l','o'};
的东西,但这仅在构造时有效。
更不用说我在方法2和方法4中分别使用g++-7.3
发出一个编译警告:
warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
答案 0 :(得分:2)
如果从库中获取了char*
,并且对该部分没有任何控制权,则需要复制一些数据。当您获得库指定的内存位置时,这是不可避免的。请注意,第一种方法也是副本,只是手动方法。
我会在代码末尾使用std::string
,然后将内存复制到缓冲区。
因此,我猜想方法3可能是最好的方法,但是我真的希望该库也为您提供缓冲区大小,并且您应确保不要在其中复制太多。