Добавление байта в конец 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);
}

, 👍-1

Обсуждение

Функция strcat может объединить строку с нулевым завершением в другую строку с нулевым завершением: http://www.cplusplus.com/reference/cstring/strcat/, @Jot

Совет: Если вы работаете с массивами символов, содержимое которых меняется, просто используйте циклы для объединения двух массивов. Для этих строковых функций один из аргументов должен быть «const char *». Это называется строкой C. Например: char * name = "xxx"; Здесь вы не можете изменить содержание имени., @Mitu Raj


2 ответа


0

При использовании массива 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);
}
,

1

Существует тонкое различие между массивом символов и строкой 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