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]