массивы — добавление двоеточия (:) к неподписанному символу в переполнении стека

Я пишу библиотеку 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]» для двоичного «оператора +»

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

0

Решение

Вы могли бы использовать Sprintf:

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

Или же зЬгсру / strcat:

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

Или просто используйте C ++ станд :: строка.

2

Другие решения

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

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

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

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

3

А ты уже прошел курс программирования? Супер скидка!
Прокачать скилл $$$
×