Lektorált tananyag, ami a BKF Digitális és Kollaboratív Művészet (DIKOM) pályázatnak keretén belül valósult meg.
Szerző: Harsányi Réka, Társszerző: Juhász Márton András, Lektor: Fernezelyi Márton
Mint azt a soros kommunikációról szóló fejezetben már érintettük, a char olyanadattípus, amely 1 byte memóriát foglal és az ASCII táblázatnak megfelelően egy karakter értékét tárolja. Mivel a karakterek mindig számként tárolódnak, ezért műveleteket is végrehajthatunk rajtuk, például „A” + 1 = 66 – mert az A értéke a táblázatban 65.
Az egyszerű karakterláncokat, vagyis a karaktereket tartalmazó tömböket is (kisbetűvel) stringeknek nevezzük, és a string osztály példányait is (nagybetűvel) stringeknek hívjuk. Tehát karakterláncot kétféleképpen tudunk definiálni, string adattípusként – amin a string osztály függvényeivel komplexebb műveleteket is végezhetünk –, vagy egyszerű karaktertömbként.
Karaktertömbök
Fontos megjegyeznünk, hogy a fordítóprogram a karakterlánc végét egy ASCII 0 (null) karakterről ismeri meg, így például serial.print() függvény a string nyomtatásakor nem szalad tovább oda nem illő memóriaterületekre. Ez azt is jelenti, hogy mindig egy karakterrel hosszabbnak kell lennie a tömbnek, mint a tárolni kívánt szöveg. A karaktereket tartalmazó tömböket az alábbi példák szerint tudjuk deklarálni:
- Iniciáló értékek megadása nélkül, csak az elemek számával – a fordító lezárja null karakterrel:
char Str1[15];
- Karakterenként aposztrófokkal – az utolsó üres helyet a fordító feltölti null karakterrel, de mi is megadhatjuk a sort lezáró karaktert:
char Str2[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'o'};
char Str3[8] = {'a', 'r', 'd', 'u', 'i', 'n', 'o', '\0'};
- Szövegként idézőjelekben – ha nem adjuk meg az elemek számát, a fordító megszámolja a karaktereket és hozzáadja a végéhez a lezáró null karaktert, ahogy az üres helyet is feltölti:
char Str4[ ] = "arduino";
char Str5[8] = "arduino";
char Str6[15] = "arduino";
Bár lehetséges karaktertömb definiálása sorzáró null karakter nélkül – hacsak nem ez a célunk –, kerüljük el, mivel a legtöbb függvény, amit karakterláncokon alkalmazunk, nincs erre felkészítve. Ha a programunk futása közben furcsa, oda nem illő karakterek jelennek meg, akkor valószínűleg ezt a hibát vétettük.
Hosszú szövegeket így is megadhatunk:
char myString[] = "ez az első sor"
" ez a második sor"
" stb…";
Amikor sokféle szöveggel dolgozunk, például LCD kijelző vagy soros terminál menüjének szövegeit tároljuk, sokkal kézenfekvőbb a stringeket is egy tömbbe gyűjteni. Mivel a stringek önmagukban is tömbök, ezért kétdimenziós tömböt hozunk létre:
char* myStrings[]={"This is string 1", "This is string 2", "This is string 3", "This is string 4", "This is string 5","This is string 6"};
Az adattípus után a csillag (char*) azt jelöli, hogy ez egy mutatókból (pointer) álló tömb. Valójában minden tömb neve pointer, ezért szükséges a megkülönböztető csillag jelölés a tömböket tartalmazó tömbök létrehozásakor.
Arduino kód: 43string01
A string osztály példányai
A string osztály kifejezetten szöveg alapú adattípusok manipulálására jött létre. Az egyszerű karaktertömböktől eltérően az osztály példányain olyan függvényekkel is végezhetünk műveleteket, mint a vágás, az összefűzés, szövegrészletek keresése és cseréje. Ugyan a string adattípus használata ebből kifolyólag több memóriát igényel, mint a karakterláncé használatuk mégis sokszor megtérül.
String osztály példányait a következő módokon hozhatjuk létre:
- Konstansként idézőjelek közé zárva:
String stringOne = "Hello String"; - String() függvény hívásával konstans karaktert átkonvertálva:
String stringOne = String('a'); - Konstansból objektummá alakítva:
String stringOne = String("This is a string"); - Több stringből létrehozva:
StringstringOne = String(stringTwo + "with more"); - Szám típusú változóból:
String stringOne = String(13); - Szám típusú változóból, megadva a számrendszer alapját:
String stringOne = String(analogRead(0), DEC);
String stringOne = String(45, HEX);
String stringOne = String(255, BIN);
String stringOne = String(millis(), DEC);
String osztály további függvényei
charAt()
Visszaadja a string típusú változó n-edik karakterét.
Szintaxisa
string.charAt(n).
Paraméterei
string: az a string típusú változó, amiben;
n: az n-edik karaktert szeretnénk elérni.
setCharAt()
Lecserél egy adott karaktert a string változón belül. Csak a string hosszán belül érvényes.
Szintaxisa
setCharAt(index,c).
Paraméterei
string: string típusú változó neve;
index: a lecserélendő karakter sorszáma;
c: a lecserélendő karakter – char típusú változó.
compareTo()
Két stringet hasonlít össze, az egyenlőségüket vizsgálja, egyenlőtlenség esetén pedig az ABC sorrendben betöltött sorrendjüket.
Szintaxisa
string.compareTo(string2).
Paraméterei
string: az egyik összehasonlítandó string;
string2: a másik összehasonlítandó string.
Kimenete
negatív érték: string előrébb való string2-nél;
0: a két string megegyezik;
pozitív érték: string2 előrébb való string-nél.
Arduino kód: 44string02
Stringek egybevetésekor használhatunk összehasonlító műveleti jeleket is, mint az egyenlő == , nem egyenlő != , kisebb/nagyobb < > , nagyobb egyenlő >= , kisebb egyenlő <= , az equals() és equalsIgnoreCase() függvényeket is. A két függvény közül az előbbi megegyezik a == jellel, az utóbbi csak abban tér el, hogy figyelmen kívül hagyja a kis- és nagybetűk közötti különbségeket. Számokat is tartalmazó szövegek összehasonlításakor vegyük figyelembe, hogy a fenti függvények a stringeket karakterenként vetik egybe, így például könnyen 999 > 1000 eredményre jutnak, mivel a 9 később következik a számok sorában, mint az 1.
concat()
Összekapcsol két stringet úgy, hogy a másodikat folytatólagosan az elsőhöz ragasztja és a produktumot egy új stringbe tölti. Szám típusú változókat is hozzáadhatunk vele egy szöveghez.
Szintaxisa
string.concat(string,string2);
string.concat(string2);
string += string2.
Paraméterei
string: első változó;
string2: második változó.
Arduino kód: 45string03
startsWith()
Megvizsgálja, hogy egy string azzal a karakterlánccal kezdődik-e, mint amit egy másik tartalmaz, és igaz/hamis választ ad vissza.
Szintaxisa
string.startsWith(string2).
Paraméterei
string: string, aminek az elején keresünk;
string2: string, amit keresünk.
Arduino kód: 46string04
endsWith()
Megvizsgálja, hogy egy string azzal a karakterlánccal végződik-e, mint amit egy másik tartalmaz, és igaz/hamis választ ad vissza.
Szintaxisa
string.endsWith(string2).
Paraméterei
string: string, aminek az elején keresünk;
string2: string, amit keresünk.
Arduino kód: 47string05
indexOf() és lastIndexOf()
Szövegen belüli keresést hajthatunk végre a segítségükkel, mely során a keresendő minta lehet karakter (char) vagy string típusú is. Alapértelmezésként az indexOf() a string elejétől kezdi a keresést, de megadhatunk kezdő pozíciót is. A lastIndexOf() abban különbözik, hogy képes a string végéről visszafelé keresni. Mindkét függvény a találat tömbön belüli indexét adja vissza és –1-et, ha nem talál egyezést.
Szintaxisuk
string.indexOf(val);
string.indexOf(val, from);
string.lastIndexOf(val);
string.lastIndexOf(val, from).
Paramétereik
string: amiben keresünk;
val: amit keresünk, lehet char vagy string;
from: a karakter pozíciója a tömbben, ahonnan a keresés indul.
Arduino kód: 48string06
length()
Visszaadja a string karaktereinek számát a lezáró null karakter nélkül.
Szintaxisa
string.length().
Paramétere
string: aminek a hosszára kíváncsiak vagyunk.
trim()
Levágja a szöveget megelőző vagy követő üres helyeket és az eredményt visszatölti az eredeti változóba. Az szünetnek látszó üres karakterek például: SPACE (ASCII 32), tab (ASCII 9), függőleges tab (ASCII 11), sor elejére ugrás (ASCII 13), új sor (ASCII 11).
Szintaxisa
string.trim().
Paramétere
string: amit szeretnénk megváltoztatni.
Arduino kód: 49string07
substring()
Egy string tetszőleges részletét adja vissza, amit a tömb indexeivel határolhatunk. A kezdőpozíción található karakter még bele fog esni a kimásolt karakterláncba, míg a végpozíción található karakter már nem. Ha nem adunk meg végpozíciót, akkor az automatikusan a karakterlánc vége lesz.
Szintaxisa
string.substring(from);
string.substring(from, to).
Paraméterei
string: amiből karakterláncot másolunk;
from: a tömb indexe, ami a kezdőpozíciót jelöli;
to: a tömb indexe, ami a végpozíciót jelöli.
Arduino kód: 50string08
replace()
Kicserél két karakterláncot egy stringen belül, de csak akkor, ha amire cserélünk, nem hosszabb, mint az egész string. Máskülönben a fordító hiba nélkül továbblép és az eredeti string változatlan marad.
Szintaxisa
string.replace(substring1, substring2).
Paraméterei
string: a karakterlánc, aminek egy részét cseréljük;
substring1: amit ki szeretnénk cserélni;
substring2: amire ki szeretnénk cserélni.
Arduino kód: 51string09
toLowerCase()
Átalakítja egy stringben a nagybetűket kisbetűkké és visszatölti az eredményt az eredeti változóba. Ezzel szemben a toUppercase() a kisbetűket alakítja nagybetűkké.
Szintaxisa
string.toLowerCase();
string.toUpperCase().
Paramétere
string: amin a változtatást végrehajtjuk.
getBytes()
Előfordulhat, hogy szeretnénk a string típusát átalakítani. Ha byte-okat tartalmazó tömbként szeretnénk a karakterláncot kezelni, akkor ez a függvény kimásolja a string tartalmát byte-onként egy tömbbe.
Szintaxisa
string.getBytes(buf, len).
Paraméterei
string: string változónk, aminek a tartalmát másoljuk;
buf: byte[] (byte tömb) típusú változónk, ahová másolunk;
len: a byte tömbünk hossza (unsigned int típusú).
toCharArray()
Hasonlóan az előzőhöz, kimásolja a string tartalmát és egyszerű karaktereket tartalmazó tömbbe tölti.
Szintaxisa
string.toCharArray(buf, len).
Paraméterei
string: string változónk, aminek a tartalmát másoljuk;
buf: char[] (karakter tömb) típusú változónk, ahová másolunk;
len: a karakterlánc hossza (unsigned int típusú).
- - - - - - - - - -
forrás: http://arduino.cc/en/Tutorial/HomePage