Меню Рубрики

Ардуино работа со строками

Текстовые строки могут быть объявлены двумя способами: можно использовать тип данных String, который входит в ядро, начиная с версии 0019; либо объявить строку как массив символов char с нулевым символом в конце. На этой странице описан второй способ. Для получения более подробной информации об объекте String, предоставляющем больше возможностей ценой большего расхода памяти, см. страницу String — объект.

Примеры

Ниже представлены примеры правильного объявления строк.

Допускаемые операции при объявлении строк

  • Объявить массив символов без его инициализации (Str1)
  • Объявить массив символов с одним избыточным элементом, компилятор сам добавит требуемый нулевой символ (Str2)
  • Добавить нулевой символ явно (Str3)
  • Инициализировать массив с помощью строковой константы, заключенной в кавычки; компилятор создаст массив необходимого размера с нулевым символом в конце (Str4)
  • Инициализировать массив с помощью строковой константы, явно указав его размер (Str5)
  • Инициализировать массив избыточного размера, оставив место для более длинных строк (Str6)

Нулевой завершающий символ

Как правило, все строки завершаются нулевым символом (ASCII код 0), который позволяет функциям (подобным Serial.print()) определять длину строки. Без этого символа они продолжали ли бы последовательно считывать байты памяти, которые фактически уже не являлись бы частью строки.

По сути, это означает, что длина вашей строки должна быть на 1 символ больше, чем текст, который вы хотели бы в ней хранить. Именно поэтому Str2 и Str5 должны быть длиной 8 символов, несмотря на то, что слово "arduino" занимает всего 7 — последняя позиция автоматически заполняется нулевым символом. Размер Str4 автоматически станет равным 8 — один символ требуется для завершающего нуля. В строке Str3 мы самостоятельно указали нулевой символ (обозначается ‘’).

Следует иметь в виду, что в целом можно объявить строку и без завершающего нулевого символа (например, если задать длину Str2 равной 7, а не 8). Однако это приведет к неработоспособности большинства строковых функций, поэтому не следует намеренно так делать. Такая ошибка может быть причиной странного поведения или появления сторонних символов при работе со строками.

Одинарные или двойные кавычки?

Строки всегда объявляются в двойных кавычках ("Abc"), а символы всегда объявляются в одинарных кавычках (‘A’).

Перенос длинных строк

Длинные строки можно переносить так:

Массивы строк

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

В нижеследующей программе звездочка после указания типа данных char "char*" показывает, что переменная является массивом "указателей". Все имена массивов фактически являются указателями, поэтому звездочка необходима для создания массива массивов. Указатели в C — одна из наиболее сложных вещей для начинающих, но в данном случае глубокого понимания указателей для их эффективного использования вовсе не требуется.

  • Уроки
  • Программирование
  • Строки и массивы символов

Строки

Строка (String), как понятно из названия, это совокупность символов. По сути строка это одномерный массив типа данных char, про массивы мы уже недавно говорили и вы должны понять, о чём идёт речь. Как и в случае с массивом символов, к каждому элементу строки можно обратиться при помощи квадратных скобок. Основным отличием строки от массива символов является тот факт, что строка – динамический массив, у которого не нужно указывать размер. Также строка является не просто типом данных, а объектом, объектом очень мощного класса String.

Читайте также:  Векторная диаграмма индукционного регулятора

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

Как вы могли заметить, строки можно объявлять большим количеством способов, а также буквально складывать строки, как числа, оператором +. Я уже говорил, что строки являются объектами класса String, и у этого класса есть огромное количество удобных методов по работе со строками, далее мы их все рассмотрим с некоторыми примерами. Но для начала запомните вот что: строки – очень тяжёлый инструмент, очень медленный и занимающий кучу памяти: уже просто само наличие строк (от одной и более) в прошивке занимает +5% Flash памяти, т.к. подключается сам “инструмент” – класс String. Для небольших проектов это не страшно, памяти всегда будет навалом.

Инструменты для String

Итак, методы для работы со строками. Как и все методы, они применяются к своим объектам (к строкам) через точку. В рассмотренных ниже примерах строка называется myString.

myString.charAt(index);

Возвращает элемент строки myString под номером index. Аналог – myString[index];

myString.setCharAt(index, val);

Записывает в строку myString символ val на позицию index. Аналог – myString[index] = val;

myString.concat(value);

Присоединяет value к строке (value может иметь любой численный тип данных). Возвращает true при успешном выполнении, false при ошибке. Аналог – сложение, myString + value;

myString.endsWith(myString2);

Проверяет, заканчивается ли myString символами из myString2. В случае совпадения возвращает true

myString.startsWith(myString2);

Проверяет, начинается ли myString символами из myString2. В случае совпадения возвращает true

myString.equals(myString2);

Возвращает true, если myString совпадает с myString2. Регистр букв важен

myString.equalsIgnoreCase (myString2);

Возвращает true, если myString совпадает с myString2. Регистр букв неважен

myString.indexOf(val);
myString.indexOf(val, from);

Ищет и возвращает номер (позицию) значения val в строке, ищет слева направо, возвращает номер первого символа в совпадении. val может быть char или String, то есть ищем в строке другую строку или символ. Можно искать, начиная с позиции from. В случае, когда не может найти val в строке, возвращает -1.

myString.lastIndexOf(val);
myString.lastIndexOf(val, from);

Ищет и возвращает номер (позицию) значения val в строке, ищет справа налево, возвращает номер последнего символа в совпадении. val может быть char или String, то есть ищем в строке другую строку или символ. Можно искать, начиная с позиции from. В случае, когда не может найти val в строке, возвращает -1.

myString.length();

Возвращает длину строки в количестве символов

myString.remove(index);
myString.remove(index, count);

Удаляет из строки символы, начиная с index и до конца, либо до указанного count

myString.replace(substring1, substring2);

В строке myString заменяет последовательность символов substring1 на substring2.

myString.reserve(size);

Зарезервировать в памяти количество байт size для работы со строкой

myString.c_str();

Читайте также:  Занавеска на дверь из бамбука

Преобразовывает строку в “СИ” формат (null-terminated string) и возвращает указатель на полученную строку

myString.trim();

Удаляет пробелы из начала и конца строки. Действует со строкой, к которой применяется

myString.substring(from);
myString.substring(from, to);

Возвращает кусок строки, содержащейся в myString начиная с позиции from и до конца, либо до позиции to

myString.toCharArray(buf, len);

Раскидывает строку в массив – буфер buf (типа char []) с начала и до длины len

myString.getBytes(buf, len);

Копирует указанное количество символов len (вплоть до unsigned int) в буфер buf (byte [])

myString.toFloat();

Возвращает содержимое строки в тип данных float

myString.toDouble();

Возвращает содержимое строки в тип данных double

myString.toInt();

Возвращает содержимое строки в тип данных int

myString.toLowerCase();

Переводит все символы в нижний регистр. Было ААААА – станет ааааа

myString.toUpperCase();

Переводит все символы в верхний регистр. Было ааааа – станет ААААА

Длина строки

Небольшой комментарий по поводу длины строки: мы можем узнать длину строки двумя способами, при помощи оператора sizeof() и метода length(). Давайте разберём отличия между ними:

Оператор sizeof вернёт размер строки в байтах. Строка содержит “нулевой символ” на конце, этот символ тоже весит один байт, соответственно оператор вернёт число 6. Метод length возвращает длину строки в количестве символов, не считая завершающий нулевой, поэтому результат будет 5.

F() macro

Строки являются очень тяжёлым с точки зрения использования памяти инструментом, ведь текст в строке хранится в оперативной памяти микроконтроллера, а её не так уж и много. Есть готовый инструмент, позволяющий удобно хранить текстовые данные во Flash памяти микроконтроллера. Этот способ хорош для вывода фиксированных текстовых данных, например, в монитор порта:

Строка “Hello, World!” будет записана во Flash память и не займёт 14 байт (13 + нулевой) в оперативной.

Массивы символов

Массивы символов, они же char array, являются ещё одним способом работы с текстовыми данными. Этот вариант имеет гораздо меньше возможностей по работе с текстом, но зато занимает меньше места в памяти (не используется элемент String) и работает значительно быстрее. К массиву символов применяются те же правила, какие работают для обычных массивов. Рассмотрим пример, в котором объявим массив символов, поработаем с ним, и выведем в порт:

В отличие от строк, массивы символов нельзя:

Длина строки char array

Для определения длины текста можно использовать оператор strlen, который возвращает количество символов в массиве. Сравним его работу с оператором sizeof:

Здесь оператор sizeof вернул количество байт, занимаемое массивом. Массив я специально объявил с размером бОльшим, чем содержащийся в нём текст. А вот оператор strlen посчитал и вернул количество символов, которые идут с начала массива и до нулевого символа в конце текста.

Массив строк

Очень мощной фишкой массивов символов является возможность создать один массив с несколькими строками, и обращаться к ним по номеру. Выглядит это следующим образом:

Данный способ работы со строками хорош тем, что строки хранятся под номерами, и это крайне удобно при работе с дисплеями и в частности создании текстового меню: практически все библиотеки дисплеев умеют выводить массив символов одной командой.

Экономия памяти

“Строки” в массиве строк тоже хранятся в оперативной памяти, что не очень здорово. Ещё больше не здорово то, что применить рассмотренный F() macro к ним нельзя, потому что фактически это не строки. То есть вот такой код приведёт к ошибке:

Читайте также:  Гост по прокладке слаботочных кабелей

Как же быть? Массив строк можно сохранить в PROGMEM, программной памяти микроконтроллера, то есть во Flash. Вот такую конструкцию можно использовать как шаблон:

Да, сложно и громоздко, но при большом объёме текстовых данных это может спасти проект!

Текстовые строки могут быть объявлены двумя способами: можно использовать тип данных String, который входит в ядро, начиная с версии 0019; либо объявить строку как массив символов char с нулевым символом в конце. На этой странице описан второй способ. Для получения более подробной информации об объекте String, предоставляющем больше возможностей ценой большего расхода памяти, см. страницу String — объект.

Примеры

Ниже представлены примеры правильного объявления строк.

Допускаемые операции при объявлении строк

  • Объявить массив символов без его инициализации (Str1)
  • Объявить массив символов с одним избыточным элементом, компилятор сам добавит требуемый нулевой символ (Str2)
  • Добавить нулевой символ явно (Str3)
  • Инициализировать массив с помощью строковой константы, заключенной в кавычки; компилятор создаст массив необходимого размера с нулевым символом в конце (Str4)
  • Инициализировать массив с помощью строковой константы, явно указав его размер (Str5)
  • Инициализировать массив избыточного размера, оставив место для более длинных строк (Str6)

Нулевой завершающий символ

Как правило, все строки завершаются нулевым символом (ASCII код 0), который позволяет функциям (подобным Serial.print()) определять длину строки. Без этого символа они продолжали ли бы последовательно считывать байты памяти, которые фактически уже не являлись бы частью строки.

По сути, это означает, что длина вашей строки должна быть на 1 символ больше, чем текст, который вы хотели бы в ней хранить. Именно поэтому Str2 и Str5 должны быть длиной 8 символов, несмотря на то, что слово "arduino" занимает всего 7 — последняя позиция автоматически заполняется нулевым символом. Размер Str4 автоматически станет равным 8 — один символ требуется для завершающего нуля. В строке Str3 мы самостоятельно указали нулевой символ (обозначается ‘’).

Следует иметь в виду, что в целом можно объявить строку и без завершающего нулевого символа (например, если задать длину Str2 равной 7, а не 8). Однако это приведет к неработоспособности большинства строковых функций, поэтому не следует намеренно так делать. Такая ошибка может быть причиной странного поведения или появления сторонних символов при работе со строками.

Одинарные или двойные кавычки?

Строки всегда объявляются в двойных кавычках ("Abc"), а символы всегда объявляются в одинарных кавычках (‘A’).

Перенос длинных строк

Длинные строки можно переносить так:

Массивы строк

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

В нижеследующей программе звездочка после указания типа данных char "char*" показывает, что переменная является массивом "указателей". Все имена массивов фактически являются указателями, поэтому звездочка необходима для создания массива массивов. Указатели в C — одна из наиболее сложных вещей для начинающих, но в данном случае глубокого понимания указателей для их эффективного использования вовсе не требуется.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector