Добавление байта в конец char
У меня есть функция, которой передается байт, и я хочу добавить этот байт в конец символьной строки и передать его другой функции (из Библиотека MQTT). Эта вторая функция ищет первый элемент, который будет константный символ[].
void loop() {
byte i;
for( i = 0; i < 48; i++) {
buttonTest (i);
}
}
void buttonTest( byte buttonId ){
char mTopic[10] = "garage/l";
strcat(mTopic, buttonId);
//strcpy(mTopic, buttonId);
client.publish(mTopic, "1");
digitalWrite(statusLEDArray[buttonId], HIGH);
}
Я попробовал еще несколько вещей, но не могу понять, как добавить байт в конец. В приведенном выше примере компилятор выдает мне эту ошибку: недопустимое преобразование из 'byte {aka unsigned char}' в 'const char' [-fpermissive]*
Конечная цель — добавить buttonID в конец строки, найденной в mTopic, но мне также нужно использовать это для извлечения элементов из массивов, как показано в последней строке примера.
ИЗМЕНИТЬ Переход на приведенный ниже код работает, но я продолжаю видеть предложения избегать String myVar = «Мой текст». по соображениям памяти, поэтому я попытался это сделать. Я знаю, что мне нужно больше смотреть на указатели и лучше с ними справляться. Как только я это сделаю, я, вероятно, смогу отказаться от использования String, что, по моему мнению, должно быть моей конечной целью, поскольку в прошлом я видел проблемы с памятью в скетчах, которые, по моему мнению, являются результатом плохого управления String/памятью.
void loop() {
byte i;
for( i = 0; i < 48; i++) {
buttonTest (i);
}
}
void buttonTest( byte buttonId ){
String mTopic[10] = "garage/l";
mTopic = mTopic + buttonId);
//strcat(mTopic, buttonId);
client.publish(mTopic.c_str(), "1");
digitalWrite(statusLEDArray[buttonId], HIGH);
}
@Karl_S, 👍-1
Обсуждение2 ответа
При использовании массива char
каждому из его элементов можно присвоить значение индивидуально.
void buttonTest( byte buttonId ){
char mTopic[10] = "garage/l";
mTopic[8] = (char)buttonId;
mTopic[9] = '\0';
client.publish(mTopic, "1");
digitalWrite(statusLEDArray[buttonId], HIGH);
}
Существует тонкое различие между массивом символов и строкой C.
Все строки C представляют собой массивы символов, но не все массивы символов являются строками C.
Строка AC представляет собой массив символов, заканчивающийся NULL. Поэтому строки C не могут содержать символы NULL (нулевое значение).
Существует целый набор функций библиотеки C, которые работают со строками C. strcat()
— одна из таких функций. Он добавляет одну строку C к другой. Он не добавляет ни одного символа в массив символов, что вы и пытаетесь сделать.
Похоже, у вас есть массив символов, а не строка C. (В цикле for
вы пытаетесь добавить 0 {a NULL} в строку C с помощью strcat()
, что не сработает.) Поэтому вам следует прекратить использование строковые функции, такие как strcat()
, и просто индексируйте их напрямую в массив символов.
Придирчивый парень: нулевой символ называется ASCII «NUL», тогда как «NULL» обычно означает NULL-указатель., @Edgar Bonet
Я имел в виду нулевой байт. Это ASCII NUL
в строке C или значение NULL? Кажется, что строки C рассматривают нулевое значение как «вне диапазона» значение, отличное от ASCII, что оправдывает мое написание. Я думаю, вы также можете утверждать, что это ASCII NUL., @Duncan C
ASCII NUL имеет нулевое числовое значение, так что да, это то, что завершает строку C. Но, конечно, можно возразить, что этот завершающий байт не интерпретируется как ASCII., @Edgar Bonet
Хорошо, это мой альтернативный аргумент. Завершающий байт не является ASCII, а имеет значение NULL, точно так же, как нулевой указатель не является действительным адресом памяти. Вы можете обосновать это в любом случае., @Duncan C
- Как преобразовать строку в массив байтов
- Проблемы с преобразованием byte[] в String
- Как преобразовать строку в длинную?
- Как преобразовать время EPOCH во время и дату на Arduino?
- Преобразование строки в IP-адрес
- Подключите Arduino Uno RX/TX к GPS-модулю 3,3 В NEO-M8N.
- Преобразование 16 бит в число с плавающей запятой
- Как преобразовать char[12] в byte[6]
Функция strcat может объединить строку с нулевым завершением в другую строку с нулевым завершением: http://www.cplusplus.com/reference/cstring/strcat/, @Jot
Совет: Если вы работаете с массивами символов, содержимое которых меняется, просто используйте циклы для объединения двух массивов. Для этих строковых функций один из аргументов должен быть «const char *». Это называется строкой C. Например: char * name = "xxx"; Здесь вы не можете изменить содержание имени., @Mitu Raj