Arduino - Saiten
Zeichenfolgen werden zum Speichern von Text verwendet. Sie können verwendet werden, um Text auf einem LCD oder im Fenster Arduino IDE Serial Monitor anzuzeigen. Zeichenfolgen sind auch nützlich zum Speichern der Benutzereingaben. Zum Beispiel die Zeichen, die ein Benutzer auf einer mit dem Arduino verbundenen Tastatur eingibt.
In der Arduino-Programmierung gibt es zwei Arten von Zeichenfolgen:
- Arrays von Zeichen, die mit den in der C-Programmierung verwendeten Zeichenfolgen identisch sind.
- Der Arduino-String, mit dem wir ein String-Objekt in einer Skizze verwenden können.
In diesem Kapitel lernen wir Strings, Objekte und die Verwendung von Strings in Arduino-Skizzen. Am Ende des Kapitels erfahren Sie, welche Art von Zeichenfolge in einer Skizze verwendet werden soll.
String Character Arrays
Der erste String-Typ, den wir lernen werden, ist der String, der aus einer Reihe von Zeichen des Typs besteht char. Im vorherigen Kapitel haben wir gelernt, was ein Array ist. eine aufeinanderfolgende Reihe desselben Variablentyps, der im Speicher gespeichert ist. Ein String ist ein Array von Zeichenvariablen.
Eine Zeichenfolge ist ein spezielles Array mit einem zusätzlichen Element am Ende der Zeichenfolge, das immer den Wert 0 (Null) hat. Dies wird als "nullterminierte Zeichenfolge" bezeichnet.
Beispiel für ein Zeichenfolgenarray
Dieses Beispiel zeigt, wie Sie eine Zeichenfolge erstellen und im Fenster des seriellen Monitors drucken.
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() {
}
Das folgende Beispiel zeigt, woraus eine Zeichenfolge besteht. Ein Zeichenarray mit druckbaren Zeichen und 0 als letztem Element des Arrays, um anzuzeigen, dass hier die Zeichenfolge endet. Die Zeichenfolge kann mithilfe von im Fenster Arduino IDE Serial Monitor ausgedruckt werdenSerial.println() und Übergeben des Namens der Zeichenfolge.
Das gleiche Beispiel kann bequemer geschrieben werden, wie unten gezeigt -
Example
void setup() {
char my_str[] = "Hello";
Serial.begin(9600);
Serial.println(my_str);
}
void loop() {
}
In dieser Skizze berechnet der Compiler die Größe des String-Arrays und beendet den String automatisch mit einer Null. Ein Array mit sechs Elementen und fünf Zeichen, gefolgt von einer Null, wird genauso wie in der vorherigen Skizze erstellt.
Bearbeiten von String-Arrays
Wir können ein String-Array innerhalb einer Skizze ändern, wie in der folgenden Skizze gezeigt.
Beispiel
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() {
}
Ergebnis
I like coffee and cake
I like coffee
I like coffee and tea
Die Skizze funktioniert folgendermaßen.
Erstellen und Drucken des Strings
In der oben angegebenen Skizze wird eine neue Zeichenfolge erstellt und dann zur Anzeige im Fenster Serial Monitor gedruckt.
String verkürzen
Die Zeichenfolge wird gekürzt, indem das 14. Zeichen in der Zeichenfolge durch eine Null ersetzt wird, die mit Null endet (2). Dies ist die Elementnummer 13 im String-Array, die von 0 an zählt.
Wenn die Zeichenfolge gedruckt wird, werden alle Zeichen bis zur neuen Null gedruckt, die mit Null endet. Die anderen Zeichen verschwinden nicht. Sie sind noch im Speicher vorhanden und das String-Array hat immer noch die gleiche Größe. Der einzige Unterschied besteht darin, dass jede Funktion, die mit Zeichenfolgen arbeitet, die Zeichenfolge nur bis zum ersten Nullterminator sieht.
Ändern eines Wortes in der Zeichenfolge
Schließlich ersetzt die Skizze das Wort "Kuchen" durch "Tee" (3). Zuerst muss der Nullterminator bei like [13] durch ein Leerzeichen ersetzt werden, damit die Zeichenfolge im ursprünglich erstellten Format wiederhergestellt wird.
Neue Zeichen überschreiben "cak" des Wortes "Kuchen" mit dem Wort "Tee". Dies erfolgt durch Überschreiben einzelner Zeichen. Das 'e' von "Kuchen" wird durch ein neues Null-Abschlusszeichen ersetzt. Das Ergebnis ist, dass die Zeichenfolge tatsächlich mit zwei Nullzeichen abgeschlossen wird, dem ursprünglichen am Ende der Zeichenfolge und dem neuen, das das 'e' in "Kuchen" ersetzt. Dies macht keinen Unterschied, wenn die neue Zeichenfolge gedruckt wird, da die Funktion, die die Zeichenfolge druckt, das Drucken der Zeichenfolgenzeichen beendet, wenn sie auf den ersten Nullterminator trifft.
Funktionen zum Bearbeiten von String-Arrays
In der vorherigen Skizze wurde die Zeichenfolge manuell bearbeitet, indem auf einzelne Zeichen in der Zeichenfolge zugegriffen wurde. Um die Bearbeitung von String-Arrays zu vereinfachen, können Sie dazu eigene Funktionen schreiben oder einige der String-Funktionen aus dem verwendenC Sprachbibliothek.
S.No. | Funktionen & Beschreibung |
---|---|
1 |
String() Mit der String-Klasse, die ab Version 0019 Teil des Kerns ist, können Sie Textzeichenfolgen komplexer verwenden und bearbeiten als Zeichenarrays. Sie können Strings verketten, an sie anhängen, nach Teilzeichenfolgen suchen und diese ersetzen und vieles mehr. Es benötigt mehr Speicher als ein einfaches Zeichenarray, ist aber auch nützlicher. Als Referenz werden Zeichenarrays als Zeichenfolgen mit einem kleinen 's' bezeichnet, und Instanzen der Zeichenfolgenklasse werden als Zeichenfolgen mit einem Großbuchstaben S bezeichnet. Beachten Sie, dass konstante Zeichenfolgen, die in "doppelten Anführungszeichen" angegeben sind, als Zeichenarrays behandelt werden. keine Instanzen der String-Klasse |
2 |
charAt() Greifen Sie auf ein bestimmtes Zeichen der Zeichenfolge zu. |
3 |
compareTo() Vergleicht zwei Strings und testet, ob einer vor oder nach dem anderen kommt oder ob sie gleich sind. Die Zeichenfolgen werden zeichenweise unter Verwendung der ASCII-Werte der Zeichen verglichen. Das heißt zum Beispiel, 'a' kommt vor 'b', aber nach 'A'. Zahlen kommen vor Buchstaben. |
4 |
concat() Hängt den Parameter an einen String an. |
5 |
c_str() Konvertiert den Inhalt einer Zeichenfolge in eine nullterminierte Zeichenfolge im C-Stil. Beachten Sie, dass dies direkten Zugriff auf den internen String-Puffer bietet und mit Vorsicht verwendet werden sollte. Insbesondere sollten Sie die Zeichenfolge niemals über den zurückgegebenen Zeiger ändern. Wenn Sie das String-Objekt ändern oder es zerstören, wird ein zuvor von c_str () zurückgegebener Zeiger ungültig und sollte nicht mehr verwendet werden. |
6 |
endsWith() Testet, ob ein String mit den Zeichen eines anderen Strings endet. |
7 |
equals() Vergleicht zwei Zeichenfolgen auf Gleichheit. Der Vergleich unterscheidet zwischen Groß- und Kleinschreibung, was bedeutet, dass der String "Hallo" nicht dem String "HALLO" entspricht. |
8 |
equalsIgnoreCase() Vergleicht zwei Zeichenfolgen auf Gleichheit. Der Vergleich unterscheidet nicht zwischen Groß- und Kleinschreibung, dh der String ("Hallo") entspricht dem String ("HALLO"). |
9 |
getBytes() Kopiert die Zeichen der Zeichenfolge in den angegebenen Puffer. |
10 |
indexOf() Findet ein Zeichen oder einen String in einem anderen String. Standardmäßig wird am Anfang des Strings gesucht, es kann jedoch auch an einem bestimmten Index begonnen werden, sodass alle Instanzen des Zeichens oder des Strings gefunden werden können. |
11 |
lastIndexOf() Findet ein Zeichen oder einen String in einem anderen String. Standardmäßig wird vom Ende des Strings aus gesucht, es kann jedoch auch von einem bestimmten Index aus rückwärts gearbeitet werden, sodass alle Instanzen des Zeichens oder des Strings gefunden werden können. |
12 |
length() Gibt die Länge des Strings in Zeichen zurück. (Beachten Sie, dass dies kein abschließendes Nullzeichen enthält.) |
13 |
remove() Ändern Sie an Ort und Stelle eine Zeichenfolge, bei der Zeichen aus dem angegebenen Index bis zum Ende der Zeichenfolge oder vom angegebenen Index bis zum Index plus Anzahl entfernt werden. |
14 |
replace() Mit der Funktion String replace () können Sie alle Instanzen eines bestimmten Zeichens durch ein anderes Zeichen ersetzen. Sie können replace auch verwenden, um Teilzeichenfolgen eines Strings durch eine andere Teilzeichenfolge zu ersetzen. |
15 |
reserve() Mit der Funktion String reserv () können Sie einen Puffer im Speicher zum Bearbeiten von Zeichenfolgen zuweisen. |
16 |
setCharAt() Legt ein Zeichen für den String fest. Hat keine Auswirkung auf Indizes außerhalb der vorhandenen Länge des Strings. |
17 |
startsWith() Testet, ob ein String mit den Zeichen eines anderen Strings beginnt oder nicht. |
18 |
toCharArray() Kopiert die Zeichen der Zeichenfolge in den angegebenen Puffer. |
19 |
substring() Holen Sie sich einen Teilstring eines Strings. Der Startindex ist inklusive (das entsprechende Zeichen ist in der Teilzeichenfolge enthalten), der optionale Endindex ist jedoch exklusiv (das entsprechende Zeichen ist nicht in der Teilzeichenfolge enthalten). Wenn der Endindex weggelassen wird, wird der Teilstring bis zum Ende des Strings fortgesetzt. |
20 |
toInt() Konvertiert einen gültigen String in eine Ganzzahl. Die Eingabezeichenfolge sollte mit einer Ganzzahl beginnen. Wenn die Zeichenfolge nicht ganzzahlige Zahlen enthält, beendet die Funktion die Konvertierung. |
21 |
toFloat() Konvertiert einen gültigen String in einen Float. Die Eingabezeichenfolge sollte mit einer Ziffer beginnen. Wenn die Zeichenfolge nichtstellige Zeichen enthält, beendet die Funktion die Konvertierung. Beispielsweise werden die Zeichenfolgen "123.45", "123" und "123fish" in 123.45, 123.00 bzw. 123.00 konvertiert. Beachten Sie, dass "123.456" mit 123.46 angenähert ist. Beachten Sie auch, dass Floats nur eine Genauigkeit von 6-7 Dezimalstellen haben und dass längere Zeichenfolgen möglicherweise abgeschnitten werden. |
22 |
toLowerCase() Holen Sie sich eine Kleinbuchstabenversion eines Strings. Ab 1.0 ändert toLowerCase () die vorhandene Zeichenfolge, anstatt eine neue zurückzugeben. |
23 |
toUpperCase() Holen Sie sich eine Großbuchstabenversion eines Strings. Ab 1.0 ändert toUpperCase () die vorhandene Zeichenfolge, anstatt eine neue zurückzugeben. |
24 |
trim() Holen Sie sich eine Version des Strings, wobei alle führenden und nachfolgenden Leerzeichen entfernt werden. Ab 1.0 ändert trim () die vorhandene Zeichenfolge, anstatt eine neue zurückzugeben. |
Die nächste Skizze verwendet einige C-String-Funktionen.
Beispiel
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() {
}
Ergebnis
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
Die Skizze funktioniert folgendermaßen.
Drucken Sie den String
Die neu erstellte Zeichenfolge wird wie in den vorherigen Skizzen im Fenster "Serieller Monitor" gedruckt.
Holen Sie sich die Länge der Zeichenfolge
Die Funktion strlen () wird verwendet, um die Länge des Strings abzurufen. Die Länge der Zeichenfolge gilt nur für die druckbaren Zeichen und enthält nicht den Nullterminator.
Die Zeichenfolge enthält 17 Zeichen, sodass 17 im Fenster Serial Monitor gedruckt werden.
Ermitteln Sie die Länge des Arrays
Der Operator sizeof () wird verwendet, um die Länge des Arrays abzurufen, das die Zeichenfolge enthält. Die Länge enthält den Nullterminator, daher ist die Länge eins länger als die Länge der Zeichenfolge.
sizeof () sieht aus wie eine Funktion, ist aber technisch gesehen ein Operator. Es ist kein Teil der C-String-Bibliothek, wurde jedoch in der Skizze verwendet, um den Unterschied zwischen der Größe des Arrays und der Größe des Strings (oder der String-Länge) anzuzeigen.
Kopieren Sie einen String
Die Funktion strcpy () wird verwendet, um die Zeichenfolge str [] in das Array out_num [] zu kopieren. Die Funktion strcpy () kopiert die zweite an sie übergebene Zeichenfolge in die erste Zeichenfolge. Eine Kopie der Zeichenfolge ist jetzt im Array out_num [] vorhanden, nimmt jedoch nur 18 Elemente des Arrays ein, sodass das Array noch 22 freie Zeichenelemente enthält. Diese freien Elemente werden nach der Zeichenfolge im Speicher gefunden.
Die Zeichenfolge wurde in das Array kopiert, damit im nächsten Teil der Skizze, in dem am Ende einer Zeichenfolge eine Zeichenfolge hinzugefügt wird, zusätzlicher Platz im Array zur Verfügung steht.
Hänge einen String an einen String an (verketten)
Die Skizze verbindet eine Zeichenfolge mit einer anderen, was als Verkettung bezeichnet wird. Dies erfolgt mit der Funktion strcat (). Die Funktion strcat () setzt die zweite übergebene Zeichenfolge an das Ende der ersten übergebenen Zeichenfolge.
Nach der Verkettung wird die Länge der Zeichenfolge gedruckt, um die neue Zeichenfolgenlänge anzuzeigen. Die Länge des Arrays wird dann gedruckt, um zu zeigen, dass wir eine 25 Zeichen lange Zeichenfolge in einem Array mit 40 Elementen haben.
Denken Sie daran, dass die 25 Zeichen lange Zeichenfolge aufgrund der mit Null endenden Null tatsächlich 26 Zeichen des Arrays einnimmt.
Array-Grenzen
Bei der Arbeit mit Strings und Arrays ist es sehr wichtig, innerhalb der Grenzen von Strings oder Arrays zu arbeiten. In der Beispielskizze wurde ein Array mit einer Länge von 40 Zeichen erstellt, um den Speicher zuzuweisen, der zum Bearbeiten von Zeichenfolgen verwendet werden kann.
Wenn das Array zu klein gemacht wurde und wir versucht haben, eine Zeichenfolge zu kopieren, die größer als das Array ist, wird die Zeichenfolge über das Ende des Arrays kopiert. Der Speicher hinter dem Ende des Arrays könnte andere wichtige Daten enthalten, die in der Skizze verwendet werden und dann von unserer Zeichenfolge überschrieben werden. Wenn der Speicher hinter dem Ende der Zeichenfolge überschritten wird, kann die Skizze abstürzen oder unerwartetes Verhalten verursachen.