Arduino - струны

Строки используются для хранения текста. Их можно использовать для отображения текста на ЖК-дисплее или в окне последовательного монитора Arduino IDE. Строки также полезны для хранения пользовательского ввода. Например, символы, которые пользователь вводит на клавиатуре, подключенной к Arduino.

В программировании Arduino есть два типа строк:

  • Массивы символов, аналогичные строкам, используемым в программировании на C.
  • Строка Arduino, которая позволяет нам использовать строковый объект в эскизе.

В этой главе мы изучим строки, объекты и использование строк в эскизах Arduino. К концу главы вы узнаете, какой тип струны использовать в эскизе.

Строковые массивы символов

Первый тип строки, которую мы изучим, - это строка, представляющая собой серию символов типа char. В предыдущей главе мы узнали, что такое массив; последовательный ряд одного и того же типа переменной, хранящейся в памяти. Строка - это массив переменных типа char.

Строка - это специальный массив, который имеет один дополнительный элемент в конце строки, который всегда имеет значение 0 (ноль). Это известно как «строка с завершающим нулем».

Пример массива строковых символов

В этом примере показано, как создать строку и распечатать ее в окне последовательного монитора.

Example

void setup() {
   char my_str[6]; // an array big enough for a 5 character string
   Serial.begin(9600);
   my_str[0] = 'H'; // the string consists of 5 characters
   my_str[1] = 'e';
   my_str[2] = 'l';
   my_str[3] = 'l';
   my_str[4] = 'o';
   my_str[5] = 0; // 6th array element is a null terminator
   Serial.println(my_str);
}

void loop() { 

}

В следующем примере показано, из чего состоит строка; массив символов с печатаемыми символами и 0 в качестве последнего элемента массива, чтобы показать, что здесь заканчивается строка. Строку можно распечатать в окне Serial Monitor Arduino IDE, используяSerial.println() и передача имени строки.

Этот же пример можно записать более удобным способом, как показано ниже -

Example

void setup() {
   char my_str[] = "Hello";
   Serial.begin(9600);
   Serial.println(my_str);
}

void loop() {

}

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

Управление строковыми массивами

Мы можем изменить массив строк в эскизе, как показано на следующем эскизе.

пример

void setup() {
   char like[] = "I like coffee and cake"; // create a string
   Serial.begin(9600);
   // (1) print the string
   Serial.println(like);
   // (2) delete part of the string
   like[13] = 0;
   Serial.println(like);
   // (3) substitute a word into the string
   like[13] = ' '; // replace the null terminator with a space
   like[18] = 't'; // insert the new word
   like[19] = 'e';
   like[20] = 'a';
   like[21] = 0; // terminate the string
   Serial.println(like);
}

void loop() {

}

Результат

I like coffee and cake
I like coffee
I like coffee and tea

Скетч работает следующим образом.

Создание и печать строки

В приведенном выше эскизе создается новая строка, которая затем печатается для отображения в окне Serial Monitor.

Укорочение струны

Строка укорачивается путем замены 14-го символа в строке нулевым завершающим нулем (2). Это элемент номер 13 в массиве строк, отсчитываемый от 0.

Когда строка печатается, печатаются все символы до нового нуля, заканчивающегося нулем. Остальные персонажи никуда не денутся; они все еще существуют в памяти, и массив строк по-прежнему имеет тот же размер. Единственное отличие состоит в том, что любая функция, которая работает со строками, будет видеть только строку до первого нулевого терминатора.

Изменение слова в строке

Наконец, в скетче слово «торт» заменяется словом «чай» (3). Сначала необходимо заменить нулевой ограничитель в подобной [13] пробелом, чтобы строка была восстановлена ​​в первоначально созданном формате.

Новые символы заменяют «cak» слова «cake» словом «tea». Это делается путем перезаписи отдельных символов. Буква "e" слова "cake" заменяется новым завершающим символом null. В результате строка фактически заканчивается двумя нулевыми символами: исходным в конце строки и новым, заменяющим букву «e» в «cake». Это не имеет значения, когда печатается новая строка, потому что функция, которая печатает строку, прекращает печать символов строки, когда встречает первый нулевой терминатор.

Функции для управления массивами строк

Предыдущий эскиз управлял строкой вручную, обращаясь к отдельным символам в строке. Чтобы упростить управление строковыми массивами, вы можете написать для этого свои собственные функции или использовать некоторые строковые функции изC языковая библиотека.

S.No. Функции и описание
1

String()

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

Для справки, массивы символов называются строками с маленькой буквой 's', а экземпляры класса String называются строками с заглавной S. Обратите внимание, что постоянные строки, указанные в «двойных кавычках», обрабатываются как массивы символов, не экземпляры класса String

2

charAt()

Доступ к определенному символу строки.

3

compareTo()

Сравнивает две строки, проверяя, идет ли одна до или после другой и равны ли они. Строки сравниваются посимвольно с использованием значений символов ASCII. Это означает, например, что «a» стоит перед «b», но после «A». Цифры идут перед буквами.

4

concat()

Добавляет параметр в строку.

5

c_str()

Преобразует содержимое строки в строку в стиле C с завершающим нулем. Обратите внимание, что это дает прямой доступ к внутреннему буферу String, и его следует использовать с осторожностью. В частности, вы никогда не должны изменять строку с помощью возвращаемого указателя. Когда вы изменяете объект String или когда он уничтожается, любой указатель, ранее возвращенный c_str (), становится недействительным и больше не должен использоваться.

6

endsWith()

Проверяет, заканчивается ли строка символами другой строки.

7

equals()

Сравнивает две строки на равенство. При сравнении учитывается регистр, то есть строка «hello» не равна строке «HELLO».

8

equalsIgnoreCase()

Сравнивает две строки на равенство. При сравнении регистр не учитывается, что означает, что строка («привет») равна строке («ПРИВЕТ»).

9

getBytes()

Копирует символы строки в предоставленный буфер.

10

indexOf()

Находит символ или строку в другой строке. По умолчанию поиск выполняется с начала строки, но может также начинаться с заданного индекса, что позволяет найти все экземпляры символа или строки.

11

lastIndexOf()

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

12

length()

Возвращает длину строки в символах. (Обратите внимание, что это не включает завершающий нулевой символ.)

13

remove()

Измените на месте строку, удалив символы из предоставленного индекса до конца строки или из предоставленного индекса на индекс плюс счетчик.

14

replace()

Функция String replace () позволяет заменить все экземпляры данного символа другим символом. Вы также можете использовать replace для замены подстрок строки другой подстрокой.

15

reserve()

Функция String Reserve () позволяет вам выделить буфер в памяти для управления строками.

16

setCharAt()

Устанавливает символ строки. Не влияет на индексы за пределами существующей длины String.

17

startsWith()

Проверяет, начинается ли строка с символов другой строки.

18

toCharArray()

Копирует символы строки в предоставленный буфер.

19

substring()

Получить подстроку строки. Начальный индекс является включающим (соответствующий символ включен в подстроку), но необязательный конечный индекс является эксклюзивным (соответствующий символ не включается в подстроку). Если конечный индекс не указан, подстрока продолжается до конца строки.

20

toInt()

Преобразует действительную строку в целое число. Строка ввода должна начинаться с целого числа. Если строка содержит нецелые числа, функция прекратит преобразование.

21 год

toFloat()

Преобразует действительную строку в число с плавающей запятой. Строка ввода должна начинаться с цифры. Если строка содержит нецифровые символы, функция прекратит преобразование. Например, строки «123.45», «123» и «123fish» преобразуются в 123,45, 123,00 и 123,00 соответственно. Обратите внимание, что «123,456» приблизительно равно 123,46. Также обратите внимание, что числа с плавающей запятой имеют только 6-7 десятичных цифр точности и что более длинные строки могут быть усечены.

22

toLowerCase()

Получите строчную версию String. Начиная с 1.0, toLowerCase () изменяет строку на месте, а не возвращает новую.

23

toUpperCase()

Получите версию String в верхнем регистре. Начиная с 1.0, toUpperCase () изменяет строку на месте, а не возвращает новую.

24

trim()

Получите версию String с удаленными начальными и конечными пробелами. Начиная с версии 1.0, trim () изменяет строку на месте, а не возвращает новую.

В следующем скетче используются некоторые строковые функции C.

пример

void setup() {
   char str[] = "This is my string"; // create a string
   char out_str[40]; // output from string functions placed here
   int num; // general purpose integer
   Serial.begin(9600);

   // (1) print the string
   Serial.println(str);

   // (2) get the length of the string (excludes null terminator)
   num = strlen(str);
   Serial.print("String length is: ");
   Serial.println(num);

   // (3) get the length of the array (includes null terminator)
   num = sizeof(str); // sizeof() is not a C string function
   Serial.print("Size of the array: ");
   Serial.println(num);

   // (4) copy a string
   strcpy(out_str, str);
   Serial.println(out_str);

   // (5) add a string to the end of a string (append)
   strcat(out_str, " sketch.");
   Serial.println(out_str);
   num = strlen(out_str);
   Serial.print("String length is: ");
   Serial.println(num);
   num = sizeof(out_str);
   Serial.print("Size of the array out_str[]: ");
   Serial.println(num);
}

void loop() {

}

Результат

This is my string
String length is: 17
Size of the array: 18
This is my string
This is my string sketch.
String length is: 25
Size of the array out_str[]: 40

Скетч работает следующим образом.

Распечатать строку

Вновь созданная строка печатается в окне Serial Monitor, как это было сделано на предыдущих рисунках.

Получить длину строки

Функция strlen () используется для получения длины строки. Длина строки предназначена только для печатаемых символов и не включает нулевой терминатор.

Строка содержит 17 символов, поэтому мы видим 17, напечатанных в окне Serial Monitor.

Получить длину массива

Оператор sizeof () используется для получения длины массива, содержащего строку. Длина включает нулевой терминатор, поэтому длина на единицу больше, чем длина строки.

sizeof () выглядит как функция, но технически является оператором. Он не является частью библиотеки строк C, но был использован в скетче, чтобы показать разницу между размером массива и размером строки (или длиной строки).

Скопируйте строку

Функция strcpy () используется для копирования строки str [] в массив out_num []. Функция strcpy () копирует вторую переданную ей строку в первую строку. Копия строки теперь существует в массиве out_num [], но занимает только 18 элементов массива, поэтому у нас все еще есть 22 свободных элемента char в массиве. Эти свободные элементы находятся в памяти после строки.

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

Добавить строку в строку (объединить)

Эскиз соединяет одну строку с другой, что называется конкатенацией. Это делается с помощью функции strcat (). Функция strcat () помещает вторую переданную ей строку в конец первой переданной ей строки.

После конкатенации печатается длина строки, чтобы показать новую длину строки. Затем печатается длина массива, чтобы показать, что у нас есть строка длиной 25 символов в массиве длиной 40 элементов.

Помните, что длинная строка из 25 символов фактически занимает 26 символов массива из-за нулевого завершающего нуля.

Границы массива

При работе со строками и массивами очень важно работать в рамках строк или массивов. В примере скетча был создан массив длиной 40 символов, чтобы выделить память, которую можно было бы использовать для управления строками.

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