Разделение сообщения
У меня есть строка, которую нужно разделить на определенные фрагменты.
Например, new_str="abcdefghjklmnopqrstuvwxyz
, и моя цель — разделить его на куски split_size=5
, поэтому результат должен быть: abcde
,fghij
и так далее.
new_str
получает каждый раз новую строку.
split_size
может быть любого размера.
У меня 2 вопроса:
1) Прикрепленный код выполняет свою работу, но выглядит НЕМНОГО не элегантно для такого новичка, как я. есть ли другой способ сделать это?
2) В прикрепленном коде выходные данные имеют вид Serial.println(tmp)
и должны быть заменены функцией вывода для отправки каждого фрагмента в виде сообщения MQTT. Я предпочитаю, чтобы каждый фрагмент сохранялся в глобальном массиве для последующей отправки в коде на стороне msgSplitter
.
Итак, я написал следующий код:
int split_size=5;
char new_str[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
void setup() {
Serial.begin(9600);
Serial.print("String length: ");
Serial.println(strlen(new_str));
Serial.print("Split Size: ");
Serial.println(strlen(split_size));
msgSplitter(new_str, split_size, "Split #");
}
void msgSplitter( const char* msg_in, int chop_size, char *prefix){
num=ceil((float)strlen(msg_in)/chop_size);
char tmp[50];
int pre_len;
if (num > 1) {
for (int k=0; k<num; k++) {
pre_len=0;
sprintf(tmp,"%s %d: ",prefix,k);
pre_len = strlen(tmp);
for (int i=0; i<chop_size; i++) {
tmp[i+pre_len]=(char)msg_in[i+k*chop_size];
tmp[i+1+pre_len]='\0';
}
Serial.println(tmp);
}
}
else {
Serial.println(msg_in);
}
}
@Guy . D, 👍1
1 ответ
Лучший ответ:
// объединенная версия
void msgSplitter(const char* msg_in, int chop_size, char *prefix) {
char tmp[50];
int size = strlen(msg_in);
for (int pos = 0, k = 0; pos < size; pos += chop_size) {
int l = sprintf(tmp, "%s %d: ", prefix, k++);
strncat(tmp + l, msg_in + pos, chop_size);
Serial.println(tmp);
}
}
// только версия значения
void msgSplitter(const char* msg_in, int chop_size, char *prefix) {
char tmp[chop_size + 1];
tmp[chop_size] = 0;
int size = strlen(msg_in);
for (int pos = 0; pos < size; pos += chop_size) {
strncpy(tmp, msg_in + pos, chop_size);
Serial.println(tmp);
}
}
- Возможно ли иметь массив массивов int?
- Ошибка: invalid application of 'sizeof' to incomplete type 'int []' при попытке вычислить размер массива в библиотеке
- Инициализация массива структур
- Невозможно создать массив типа const char*
- Работает ли конструкция int array[100] = {0} на Arduino?
- Массив динамического размера в качестве члена класса
- Длина константного массива uint8_t*
- Получение шестнадцатеричных данных с терминала
Можете ли вы ответить на мой второй вопрос?, @Guy . D
вторая версия функции в моем ответе — это она. замените println функцией публикации, @Juraj
Ты рок-Юрай!, @Guy . D
U2 :) ( кашель кашель ), @Guy . D