Jak parsovat řetězce v Arduinu

09.03.2024 Arduino #arduino #esp32 #string #retezce

Tento tutoriál ukazuje jk parsovat řetězce pomocí funkcí strtok() a substring() v Arduinu.


Parsování řetězce pomocí funkce strtok()

Řetězec může v Arduinu obsahovat znaky, čísla a symboly. K oddělení nebo parsování řetězce můžeme použít funkci v Arduinu - strtok().

Pokud máme například řetězec s podřetězci oddělenými čárkou, chceme oddělit každý podřetězec pomocí čárky a uložit každý podřetězec jako samostatný řetězec nebo pole znaků.

char *s = strtok(char *MyS, char *MyD);

Ve výše uvedeném kódu MyS je konstantní proměnná char, která obsahuje řetězec, který chceme parsovat, a MyD je také konstantní proměnná char, která obsahuje oddělovač, znak nebo symbol, který máme použít k parsování daného řetězce. Funkce strtok() vrátí první token nebo pole znaků před daným oddělovačem.

Abychom získali druhý token řetězce, musíme předat NULL místo daného řetězce, protože daný řetězec kromě prvního tokenu bude uložen ve funkci strtok().

Definujme například řetězec znaků a oddělme jej pomocí oddělovače a funkce strtok().

char *MyS = "this is-my-website";
char *MyD = "-";
void setup() {
  Serial.begin(9600);

  char *s = strtok(MyS, MyD);
  Serial.println(s);
  char *s1 = strtok(NULL, MyD);
  Serial.println(s1);
  char *s2 = strtok(NULL, MyD);
  Serial.println(s2);
}
void loop() {}

Výstup

this is
my
website

Ve výše uvedeném kódu jsme strtok() funkci použili třikrát, abychom získali všechny tři tokeny přítomné v daném řetězci a každý token řetězce bude uložen uvnitř pole znaků. Můžeme také použít smyčku, abychom získali všechny dostupné tokeny přítomné v daném řetězci, abychom nemuseli kód psát opakovaně.

Kód jsme napsali do setup() funkce, která se spustí pouze jednou, když napojíme desku Arduino, ale v případě velkého řetězce můžeme kód zapsat do funkce, loop() aby se opakovala. Získáme první token uvnitř setup() funkce a zkontrolujeme, zda je ve) loop() funkci k dispozici další token.

Pokud je k dispozici, uložíme jej do pole a postup opakujeme, dokud v daném řetězci nezůstanou žádné další tokeny řetězce.

Použijme například výše uvedený řetězec a najděte všechny dostupné tokeny řetězce pomocí stejného oddělovače výše.

char *MyS = "this is-my-website-Welcome";
char *MyD = "-";
char *MyArray[10];
int i = 1;
void setup() {
  Serial.begin(9600);

  char *s = strtok(MyS, MyD);
  Serial.println(s);
  MyArray[0] = s;
}
void loop() {
  char *s1 = strtok(NULL, MyD);
  if (s1 != NULL) {
    MyArray[i] = s1;
    Serial.println(MyArray[i]);
    i = i + 1;
  }
}

Ve výše uvedeném kódu jsme inicializovali pole s velikostí 10, která bude použita k uložení tokenů řetězců. Můžeme jej inicializovat podle řetězcových tokenů přítomných v daném řetězci.

Také jsme inicializovali index, který bude sloužit k ukládání hodnot uvnitř pole. Budeme jej inkrementovat uvnitř loop() funkce.

Použili jsme ifpříkaz ke kontrole, zda je token řetězce NULL nebo ne. Pokud není NULL, uložíme jej do pole a index zvýšíme.

Všimněte si, že smyčka se musí opakovat, aby se našel další token řetězce. Do funkce můžeme umístit smyčku, setup() pokud chceme získat všechny tokeny před loop() funkcí.

Před přechodem na funkci budeme mít všechny tokeny řetězců uložené uvnitř pole loop(). Oddělovačem může být libovolný znak, symbol nebo číslo přítomné v daném řetězci a jako oddělovač můžeme použít i mezeru.

Analyzujte řetězec pomocí funkce substring()

Funkci v Arduinu můžeme také použít substring() k oddělení nebo analýze řetězce. Podle zadaných hodnot indexu odděluje substring() podřetězec od daného řetězce.

Pokud chceme například získat prvních pět znaků z řetězce, můžeme použít funkci substring() a hodnotu indexu 5.

Syntax:

String s = MyS.substring(SIndex, EIndex);

Ve výše uvedeném kódu sje řetězcová proměnná použitá k uložení výstupu funkce substring() MyS je to daný řetězec s datovým typem řetězce. The SIndex je počáteční index a EIndex je koncový index pro podřetězec.

Vytvořme například řetězec a najdeme jeho podřetězec v indexu 0 to 5.

String MyS = "this is my website Welcome";

void setup() {
  Serial.begin(9600);
  String s = MyS.substring(0, 5);
  Serial.println(s);
}
void loop() {}

Výstup

this

Ve výše uvedeném kódu jsme použili sériový monitor Arduina k zobrazení výsledku. Jak můžete vidět z výstupu, prvních pět znaků nebo indexů je zobrazeno v okně sériového monitoru.

Ve výstupu vidíme pouze čtyři znaky, protože pátý znak je znak mezery. Pokud neznáme index znaku, můžeme pomocí funkce indexOf() získat index tohoto znaku.

Syntaxe funkce indexOf():

int MyI = MyS.indexOf(char);

Ve výše uvedeném kódu MyI bude proměnná ukládat výstup, což je index daného znaku a char je to znak, jehož index chceme najít. The MyS je řetězcová proměnná, která obsahuje daný řetězec.

Máme například řetězec slov oddělený mezerou a chceme z řetězce získat první slovo. Můžeme použít indexOf() funkci k nalezení indexu znaku mezery a poté předat tento index do substring() funkce, abychom získali první slovo.

String MyS = "this is my website Welcome";

void setup() {
  Serial.begin(9600);
  int MyI = MyS.indexOf(" ");
  String s = MyS.substring(0, MyI);
  Serial.println(s);
}
void loop() {}

Jak můžete vidět na výše uvedeném výstupu, extrahovali jsme první slovo z daného řetězce. Pokud chceme z daného řetězce získat celý svět, musíme použít smyčku.

Uvnitř funkce můžeme předat i druhý argument indexOf() pro nastavení počáteční pozice, který bude sloužit k hledání indexu daného znaku.

Například ve výše uvedeném příkladu, pokud chceme získat první dvě slova řetězce, můžeme nastavit počáteční hodnotu indexu na 5 a funkce vrátí hodnotu indexu druhého oddělovače, který můžeme použít k extrakci první dvě slova.

Kód jsme napsali do setup() funkce ve výše uvedeném kódu, který se spustí pouze jednou. Ale pokud jsme napsali kód uvnitř loop() funkce, kód se bude opakovat.

Můžeme napsat kód do loop() funkce, abychom našli všechny podřetězce přítomné v daném řetězci.

Pojďme například najít všechny podřetězce přítomné ve výše uvedeném řetězci.

String MyS = "this is my website Welcome";
int MyP = 0;
int MyI = 0;
String array[10];
int index = 0;
void setup() { Serial.begin(9600); }
void loop() {
  if (MyI >= 0) {
    MyI = MyS.indexOf(" ", MyP);
    String s = MyS.substring(MyP, MyI);
    Serial.println(s);
    MyP = MyI + 1;
    array[index] = s;
    Serial.println(array[index]);
    index = index + 1;
  }
}

Výstup

this
is
my
website
Welcome

e výše uvedeném kódu jsme použili hodnotu indexu daného oddělovače uvnitř příkazu ifke kontrole, zda je dosaženo konce daného řetězce, protože funkce indexOf() vrátí zápornou hodnotu, pokud index, který jsme předali uvnitř funkce, indexOf() překročí délku daný řetězec.

Inicializovali jsme dvě celočíselné proměnné MyP MyI, které budou použity pro předchozí a aktuální hodnoty indexu.

Použijeme hodnotu MyP nebo předchozí hodnotu indexu k získání hodnoty MyI nebo další hodnoty indexu a tyto hodnoty pak použijeme k nalezení podřetězce. Poté změníme hodnotu MyP předchozího indexu na aktuální index plus jedna, aby se smyčka příště opakovala; dostaneme další slovo.

Také jsme inicializovali pole řetězců o velikosti 10, abychom uložili podřetězce podle hodnoty indexu. Budeme inkrementovat index v if příkazu, abychom uložili další podřetězec do další hodnoty indexu.

Všimněte si, že smyčka se musí opakovat, aby získala všechny podřetězce přítomné v daném řetězci. setup () Pokud chceme získat podřetězce před spuštěním funkce, můžeme použít smyčku uvnitř funkce loop().

Ve výše uvedených příkladech jsme jako oddělovač použili mezeru, ale k analýze daného řetězce můžeme použít jakýkoli znak, symbol a číslo. Funkce indexOf() substring() patří do třídy string Arduina a další podrobnosti o třídě string naleznete na tomto odkazu.