C++ 向一个C++;字符数组
我有一个库,可以导出一个C++ 向一个C++;字符数组,c++,arrays,char,C++,Arrays,Char,我有一个库,可以导出一个char*,在其中我可以生成一条消息,然后调用send(通过网络)发送消息。如何在代码中向导出的缓冲区写入非常简单的消息 我写了四种不同的方法来写信息,但没有一种是理想的: class Lib { char msg[100]; public: Lib() { // nullify the buffer msg[0] = 0; } char* get_buffer() { return msg; } void send(
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();
}
}
第一种方法对我来说似乎很乏味。第二种方法不起作用,因为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]
如果您从库中获取char*
,而您对该部分没有任何控制权,则需要复制一些数据。这是不可避免的,当你在记忆中得到图书馆指定的位置时。请注意,第一种方法也是一种副本,只是一种手动方法。
我将在代码的末尾使用std::string
,然后将内存复制到缓冲区。
因此,我想方法3可能是最好的方法,但我真的希望库也能为您提供缓冲区大小,您应该确保不要向其中复制太多。您的警告是,您正在将字符串文字转换为char*
。这是C++不再支持的东西。它们应该只分配给const char*
。最简单的解决方案是将Lib::msg
设置为std::string
char*send()
您没有从该方法返回任何内容抱歉,更改为void send()
。您得到了一个缓冲区。您必须在某个时候将数据复制到其中,以使缓冲区有用。
warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]