Главная chevron_right Уроки chevron_right Встроенные примеры chevron_right Строки chevron_right Анализ символов строки: Character Analysis

Анализ символов строки: Character Analysis

Узнайте, как определять тип символа в Arduino: буква, цифра, знак пунктуации, управляющий символ и многое другое.

В этом уроке разберём операторы классификации символов, встроенные в язык Arduino. С их помощью можно быстро определить, является ли символ буквой, цифрой, знаком препинания, управляющим кодом или пробелом — и это далеко не полный список.

Практическая ценность очевидна: при разборе команд, пришедших через Serial, или при валидации пользовательского ввода нужно точно знать, с чем имеешь дело. Скетч ниже принимает каждый символ, отправленный через монитор порта Arduino IDE, и выводит полный «паспорт» этого символа. Один символ может удовлетворять сразу нескольким условиям — например, 'A' одновременно является буквой, буквой верхнего регистра, ASCII-символом и допустимой шестнадцатеричной цифрой.

Доступные операторы

  • isAlphaNumeric()
  • символ буквенно-цифровой (буква или цифра)

  • isAlpha()
  • символ является буквой алфавита

  • isAscii()
  • символ входит в таблицу ASCII

  • isWhitespace()
  • символ является пробельным (пробел, табуляция, перевод строки и т. д.)

  • isControl()
  • символ является управляющим (коды 0–31 и 127)

  • isDigit()
  • символ является десятичной цифрой (09)

  • isGraph()
  • символ печатаемый, но не пробельный

  • isLowerCase()
  • символ в нижнем регистре

  • isPrintable()
  • символ печатаемый (включая пробел)

  • isPunct()
  • символ является знаком пунктуации

  • isSpace()
  • символ является пробелом ( )

  • isUpperCase()
  • символ в верхнем регистре

  • isHexadecimalDigit()
  • символ является допустимой шестнадцатеричной цифрой (09, af, AF)

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

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

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

Схема подключения: плата Arduino UNO без дополнительных компонентов — работа ведётся только через Serial.

Код

Откройте монитор порта в Arduino IDE, введите один символ и нажмите «Отправить». В ответ скетч выведет все характеристики этого символа.

/*

  Операторы анализа символов

  Примеры использования операторов анализа символов.

  Отправьте любой байт, и скетч расскажет о нём подробнее.

  создан 29 Nov 2010

  изменён 2 Apr 2012

  автор Tom Igoe

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

  https://www.arduino.cc/en/Tutorial/CharacterAnalysis

*/

void setup() {

  // Открываем последовательный порт и ждём подключения:

  Serial.begin(9600);

  while (!Serial) {

    ; // ожидание подключения к последовательному порту. Нужно только для native USB

  }

  // отправляем вступление:

  Serial.println("send any byte and I'll tell you everything I can about it");

  Serial.println();
}

void loop() {

  // читаем входящие байты:

  if (Serial.available() > 0) {

    int thisChar = Serial.read();

    // выводим, что было отправлено:

    Serial.print("You sent me: \'");

    Serial.write(thisChar);

    Serial.print("\'  ASCII Value: ");

    Serial.println(thisChar);

    // анализируем полученные данные:

    if (isAlphaNumeric(thisChar)) {

      Serial.println("it's alphanumeric");

    }

    if (isAlpha(thisChar)) {

      Serial.println("it's alphabetic");

    }

    if (isAscii(thisChar)) {

      Serial.println("it's ASCII");

    }

    if (isWhitespace(thisChar)) {

      Serial.println("it's whitespace");

    }

    if (isControl(thisChar)) {

      Serial.println("it's a control character");

    }

    if (isDigit(thisChar)) {

      Serial.println("it's a numeric digit");

    }

    if (isGraph(thisChar)) {

      Serial.println("it's a printable character that's not whitespace");

    }

    if (isLowerCase(thisChar)) {

      Serial.println("it's lower case");

    }

    if (isPrintable(thisChar)) {

      Serial.println("it's printable");

    }

    if (isPunct(thisChar)) {

      Serial.println("it's punctuation");

    }

    if (isSpace(thisChar)) {

      Serial.println("it's a space character");

    }

    if (isUpperCase(thisChar)) {

      Serial.println("it's upper case");

    }

    if (isHexadecimalDigit(thisChar)) {

      Serial.println("it's a valid hexadecimaldigit (i.e. 0 - 9, a - F, or A - F)");

    }

    // добавляем отступ и запрашиваем следующий байт:

    Serial.println();

    Serial.println("Give me another byte:");

    Serial.println();

  }
}

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

Каждый полученный байт последовательно проверяется всеми операторами классификации. Каждый оператор возвращает true или false, и если условие выполнено — в Serial выводится соответствующее описание. Поскольку проверки независимы, одному символу может соответствовать сразу несколько категорий.

Практические замечания

  • Операторы работают с типом char и int. Если вы передаёте значение больше 127, результат может быть неожиданным — всегда приводите данные к char или проверяйте диапазон.
  • В мониторе порта Arduino IDE по умолчанию к отправляемому символу добавляется символ перевода строки (\n). Это управляющий символ, поэтому isControl() вернёт true для «пустой» второй строки — не пугайтесь.
  • Функция isSpace() реагирует только на пробел (код 32), тогда как isWhitespace() охватывает также табуляцию, \n, \r, \f и \v.

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

  • Путаница isSpace() и isWhitespace() — они не синонимы. Если нужно отловить любой пробельный символ, используйте isWhitespace().
  • Проверка отрицательных значений — функции стандарта C ожидают значение в диапазоне 0–255 или EOF. Передача отрицательного char без приведения к unsigned char может дать неверный результат на некоторых платформах.
  • Ожидание единственного ответа — помните, что '5' одновременно является ASCII-символом, цифрой, буквенно-цифровым символом и шестнадцатеричной цифрой. Это нормальное поведение.

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

Откройте монитор порта, установите скорость 9600 бод и поочерёдно отправляйте разные символы:

СимволОжидаемые категории
Aбуква, верхний регистр, ASCII, hex-цифра
7цифра, hex-цифра, буквенно-цифровой, ASCII
!пунктуация, печатаемый, не пробел, ASCII
(пробел)пробел, пробельный, печатаемый, ASCII

Подробнее

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

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

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