Анализ символов строки: Character Analysis
Узнайте, как определять тип символа в Arduino: буква, цифра, знак пунктуации, управляющий символ и многое другое.
В этом уроке разберём операторы классификации символов, встроенные в язык Arduino. С их помощью можно быстро определить, является ли символ буквой, цифрой, знаком препинания, управляющим кодом или пробелом — и это далеко не полный список.
Практическая ценность очевидна: при разборе команд, пришедших через Serial, или при валидации пользовательского ввода нужно точно знать, с чем имеешь дело. Скетч ниже принимает каждый символ, отправленный через монитор порта Arduino IDE, и выводит полный «паспорт» этого символа. Один символ может удовлетворять сразу нескольким условиям — например, 'A' одновременно является буквой, буквой верхнего регистра, ASCII-символом и допустимой шестнадцатеричной цифрой.
Доступные операторы
- isAlphaNumeric()
символ буквенно-цифровой (буква или цифра)
- isAlpha()
символ является буквой алфавита
- isAscii()
символ входит в таблицу ASCII
- isWhitespace()
символ является пробельным (пробел, табуляция, перевод строки и т. д.)
- isControl()
символ является управляющим (коды 0–31 и 127)
- isDigit()
символ является десятичной цифрой (0–9)
- isGraph()
символ печатаемый, но не пробельный
- isLowerCase()
символ в нижнем регистре
- isPrintable()
символ печатаемый (включая пробел)
- isPunct()
символ является знаком пунктуации
- isSpace()
символ является пробелом ( )
- isUpperCase()
символ в верхнем регистре
- isHexadecimalDigit()
символ является допустимой шестнадцатеричной цифрой (0–9, a–f, A–F)
Необходимое оборудование
Схема подключения
Дополнительных компонентов для этого примера не нужно. Достаточно подключить плату к компьютеру через 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