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!