Запись в массив символов C ++ - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть библиотека, которая экспортирует 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 голосов
/ 26 сентября 2018

Если вы получаете char* из библиотеки и не имеете никакого контроля над этой частью, вам нужно будет скопировать некоторые данные.Это неизбежно, когда вы получаете место в памяти, продиктованное библиотекой.Обратите внимание, что первый метод также является копией, только ручной.
Я бы работал с std::string в вашем конце кода, а затем скопировал бы память в буфер.
Так что я думаю, что метод 3возможно, лучший, но я действительно надеюсь, что библиотека также предоставит вам размер буфера, и вы должны убедиться, что вы не копируете в него слишком много.

...