Главная chevron_right Уроки chevron_right Встроенные примеры chevron_right Строки chevron_right String startsWith() и endsWith() — проверка начала и конца строки

String startsWith() и endsWith() — проверка начала и конца строки

Узнайте, как использовать функции startsWith() и endsWith() для проверки того, с чего начинается или заканчивается строка в Arduino.

Функции startsWith() и endsWith() из класса String позволяют проверить, начинается или заканчивается ли строка определённым символом или подстрокой. По сути, это удобные частные случаи функции substring — они делают код чище и понятнее.

Необходимое оборудование

Схема подключения

Внешних компонентов для этого примера не нужно — достаточно подключить плату к компьютеру через USB и открыть Serial Monitor в Arduino IDE.

Плата Arduino UNO — никаких внешних компонентов не требуется.

Как это работает

startsWith() проверяет, начинается ли строка с указанной подстроки, а endsWith() — заканчивается ли ею. Оба метода возвращают true или false, что делает их удобными в условиях if.

Важная деталь: оба метода принимают необязательный второй аргумент — смещение (offset). Это позволяет искать подстроку не с самого начала строки, а начиная с произвольной позиции. Именно в этом их сходство с substring().

Код

startsWith() и endsWith() удобно использовать для разбора заголовков сообщений или для проверки конкретного символа в конце строки. Их также можно применять со смещением, чтобы искать подстроку, начиная с определённой позиции. Например:

stringOne = "HTTP/1.1 200 OK";
if (stringOne.startsWith("200 OK", 9)) {
Serial.println("Got an OK from the server");
}

Это функционально эквивалентно следующему:

stringOne = "HTTP/1.1 200 OK";
if (stringOne.substring(9) == "200 OK") {
Serial.println("Got an OK from the server");
}

Важно: Если вы передаёте индекс за пределами длины строки, результат будет непредсказуемым. Например, в примере выше вызов stringOne.startsWith("200 OK", 16) будет проверять не саму строку, а то, что находится в памяти сразу за ней. Чтобы избежать подобных ошибок, убедитесь, что индексы для startsWith и endsWith всегда находятся в диапазоне от 0 до значения length() строки.

/*
  String startWith() и endsWith()

  Примеры использования startsWith() и endsWith() для строк

  создан 27 июл 2010
  изменён 2 апр 2012
  автор Tom Igoe

  Код примера находится в открытом доступе.

  https://www.arduino.cc/en/Tutorial/StringStartsWithEndsWith
*/

void setup() {
  // Открываем последовательный порт и ждём его готовности:
  Serial.begin(9600);
  while (!Serial) {
    ; // ожидание подключения к последовательному порту. Нужно только для native USB
  }

  // отправляем вступление:
  Serial.println("\n\nString startsWith() and endsWith():");
  Serial.println();
}

void loop() {
  // startsWith() проверяет, начинается ли строка с заданной подстроки:
  String stringOne = "HTTP/1.1 200 OK";
  Serial.println(stringOne);
  if (stringOne.startsWith("HTTP/1.1")) {
    Serial.println("Server's using http version 1.1");
  }

  // также можно искать startsWith() начиная с заданной позиции в строке:
  stringOne = "HTTP/1.1 200 OK";
  if (stringOne.startsWith("200 OK", 9)) {
    Serial.println("Got an OK from the server");
  }

  // endsWith() проверяет, заканчивается ли строка определённым символом:
  String sensorReading = "sensor = ";
  sensorReading += analogRead(A0);
  Serial.print(sensorReading);
  if (sensorReading.endsWith("0")) {
    Serial.println(". This reading is divisible by ten");
  } else {
    Serial.println(". This reading is not divisible by ten");
  }

  // бесконечное ожидание:
  while (true);
}

Типичные ошибки

  • Выход за границы строки. Передача слишком большого смещения — самая частая проблема. Всегда проверяйте, что offset < stringOne.length().
  • Сравнение с учётом регистра. Функции startsWith() и endsWith() чувствительны к регистру: "Hello" и "hello" — разные строки. Если регистр может варьироваться, приведите строку к единому виду перед проверкой.
  • Пустая строка. Если передать пустую строку "" в качестве аргумента, startsWith("") всегда вернёт true — это корректное поведение, но может удивить.

Как проверить результат

Откройте Serial Monitor (скорость 9600 бод) после загрузки скетча. Вы увидите результаты проверок в виде сообщений — true или false для каждого условия. Это удобный способ убедиться, что логика разбора строк работает именно так, как вы ожидаете.

Где пригодится

  • Разбор ответов от HTTP-сервера или AT-команд GSM-модуля: проверить, начинается ли строка с "OK", "ERROR" или "HTTP/1.1 200".
  • Фильтрация входящих Serial-сообщений по префиксу команды.
  • Проверка расширения файла на SD-карте: заканчивается ли имя файла на ".txt" или ".csv".

Дополнительные материалы

Больше базовых примеров вы найдёте в разделе built-in examples.

Также рекомендуем изучить language reference — подробный справочник по языку программирования Arduino.

Последнее обновление: 11.08.2015, SM