写入C ++ char数组

时间:2018-09-26 19:01:25

标签: 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() {
    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]

1 个答案:

答案 0 :(得分:2)

如果从库中获取了char*,并且对该部分没有任何控制权,则需要复制一些数据。当您获得库指定的内存位置时,这是不可避免的。请注意,第一种方法也是副本,只是手动方法。
我会在代码末尾使用std::string,然后将内存复制到缓冲区。
因此,我猜想方法3可能是最好的方法,但是我真的希望该库也为您提供缓冲区大小,并且您应确保不要在其中复制太多。