Добавление двоеточия (:) к неподписанному символу в C++

Я пишу библиотеку Arduino для простой передачи данных между Arduino и компьютером, используя последовательный канал. Я создал библиотеку и т. Д. Однако у меня возникли проблемы с получением массива char и добавлением к нему двоеточия (':'). То есть,

//Sends data via println()
void simpleTransfer::sendData(char *name, char *data){
    char *str = name + ": " + data + ",";
    _serial->println(str); //Sends in form 'name: data,'
}

Это должно взять имя переменной, которую я хочу отправить, добавить двоеточие и пробел, данные, которые я хочу отправить, и, наконец, запятую. Однако вместо этого я получаю сообщения об ошибках:

недопустимые операнды типов "char*" и "const char [3]" для двоичного "оператора +"

Какова причина?

2 ответа

Решение

Вы можете использовать sprintf:

char str[64];  // Or whatever length you need to fit the resulting string
sprintf(str, "%s:%s,", name, data);

Или strcpy / strcat:

char str[64];
strcpy(str, name);
strcat(str, ":");
strcat(str, data);
strcat(str, ",");


Или просто используйте std::string в C++.

Краткий ответ: используйте std::string создать объединенную строку.

 std::string s = ((std::string(name) + ": ") + data) + ",";
_serial->println( s.c_str() );

Длинный ответ: при объединении строк в стиле C вам нужен целевой буфер, достаточно большой для хранения результата. Если вы знаете максимальный размер, к которому может когда-либо прийти результат, вы можете объявить локальный массив этого размера и использовать sprintf как объясняет другой ответ.

Или, если вы не знаете размер заранее, вы можете использовать комбинацию strlen а также new[] чтобы выделить динамический размер буфера, выполните печать, затем delete[] буфер. Но не делай этого! Вместо этого используйте строковый класс std::stringили, как упоминает Дрю Дорманн в комментариях ниже, специфичный для Arduino String учебный класс.

Другие вопросы по тегам