Поиск и замена текста

Arduino:
Поиск и замена текста

Как это сделать:

Arduino изначально не поддерживает поиск и замену строк так, как это делают высокоуровневые языки. Однако, вы можете работать с массивами символов или использовать класс String, который предлагает метод replace(). Хотя первый вариант экономит память, второй более прост в использовании. Давайте сосредоточимся на классе String для ясности.

void setup() {
  Serial.begin(9600);
  String text = "I like apples and apples are great!";
  text.replace("apples", "oranges");
  Serial.println(text);
}

void loop() {
  // Здесь делать нечего.
}

Пример вывода:

I like oranges and oranges are great!

Подробнее

В прошлом задачи манипуляции со строками на микроконтроллерах были редкостью — память была ограничена, а приложения проще. В наши дни, благодаря сложным проектам и достаточному объему памяти (благодаря прогрессу в технологии микроконтроллеров), такие утилиты стали достаточно стандартными.

Если вы не хотите использовать класс String из-за его динамического использования памяти, которое может вызвать фрагментацию, вы все еще можете искать и заменять в строках стиля C (массивах символов, заканчивающихся нулем) с помощью функций вроде strchr(), strstr(), и ручного копирования или замены с помощью циклов. Это более сложно, но дает вам больший контроль над памятью.

Например, альтернативный способ замены подстроки может выглядеть так:

void replaceSubstring(char *input, const char *search, const char *replace) {
  char buffer[100];
  char *p;

  // 'strstr' проверяет, является ли 'search' частью 'input'.
  if (!(p = strstr(input, search))) return;

  // Копируем до точки, где найден 'search'.
  strncpy(buffer, input, p - input);
  buffer[p - input] = '\0';

  // Добавляем 'replace' и остальную часть 'input' после 'search'.
  sprintf(buffer+(p - input), "%s%s", replace, p + strlen(search));

  // Выводим результат
  strcpy(input, buffer);
}

void setup() {
  Serial.begin(9600);
  char text[] = "I like apples and apples are great!";
  replaceSubstring(text, "apples", "oranges");
  Serial.println(text);
}

void loop() {
  // Здесь по-прежнему делать нечего.
}

Пример вывода:

I like oranges and oranges are great!

См. также