2014.06.22.
12:56

Írta: harsanyireka

12. Műveletek karakterláncokkal

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

 

Szólj hozzá!

Címkék: string leckék lektorált

A bejegyzés trackback címe:

https://harsanyireka.blog.hu/api/trackback/id/tr736396533

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.
süti beállítások módosítása